Authlogic - Render Partial

New to Rails. Using Authlogic for authentication and went through tutorial at github. Having a bit of a problem getting the login screen to render as a partial from a different view file.

I have a index.html.erb view file for the "home" controller.

I tried <%= render :partial => "user_sessions/user_session" %>

but it fails with this error:

"Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id"

user_sessions is the view directory for the login form created through the Authlogic tutorial. I created a partial called _user_session.html.erb which contains the entire login form and looks like this:

<% form_for @user_session, :url => user_session_path do |f| %>   <%= f.error_messages %>   <%= f.label :email %><br />   <%= f.text_field :email %><br />   <br />   <%= f.label :password %><br />   <%= f.password_field :password %><br />   <br />   <%= f.check_box :remember_me %><%= f.label :remember_me %><br />   <br />   <%= image_submit_tag("/images/Login Button.jpg") %> <% end %>

user_sessions/new.html.erb now looks like this

<%= render :partial => 'user_session' %>

And this works: http://mysite/login (setup through a named route) And this works: http://mysite/user_sessions/new

However, trying this <%= render :partial => "user_sessions/ user_session" %> in the home/index.html.erb view fails.

Can anyone help with this? I seem to be missing something really fundamental here.

Thanks

A guess, as I don't have the full backtrace and don't know what the controller that passes to the view that calls the partial rendering does: is the @user_session instance variable nil?

The controller is the "home" controller and looks like this (very basic):

class HomeController < ApplicationController   def index   end end

The view for the home controller is is just a basic home page and I just wanted to render a login partial there since I'm also planning to use it elsewhere in the app.

I assumed that there is no user_session, since a user is not logged in at this point. So, I didn't think I would need to pass it anything. I can hit http://mysite/lgoin without passing any instance variables and it shows the partial properly.

Here's a trace:

Showing app/views/user_sessions/_user_session.html.erb where line #1 raised:

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

Extracted source (around line #1):

1: <% form_for @user_session, :url => user_session_path do |f| %> 2: <%= f.error_messages %> 3: <%= f.label :email %><br /> 4: <%= f.text_field :email %><br />

Trace of template inclusion: app/views/home/index.html.erb

RAILS_ROOT: c:/wwwroot/ror/blostm Application Trace | Framework Trace | Full Trace

C:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_controller/ record_identifier.rb:76:in `dom_id' C:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_view/ helpers/record_identification_helper.rb:16:in `dom_id' C:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_view/ helpers/form_helper.rb:293:in `apply_form_for_options!' C:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_view/ helpers/form_helper.rb:277:in `form_for' c:/wwwroot/ror/mysite/app/views/user_sessions/_user_session.html.erb: 1:in `_run_erb_app47views47user_sessions47_user_session46html46erb_locals_object_user_session' c:/wwwroot/ror/mysite/app/views/home/index.html.erb:4:in `_run_erb_app47views47home47index46html46erb'

By the way, thanks for responding to my post.

Try <% form_for UserSession.new ... if you want the form to work anywhere, or make sure that @user_session is set in the controller, eg. @user_session = UserSession.new

Paul

pabcas - Thanks for responding to my question. I really appreciate the help. Changing my partial to use "UserSession.new" seemed to work. The "home" page was able to render properly.

I checked the user_sessions_controller.rb file and I have this method defined.

def new     @user_session = UserSession.new end

Did you mean the home_controller.rb file?

Paul - Just an update. Although changing the partial as you suggested allowed the "home" page to render properly, I think it also kept Authlogic from working properly.

When the partial contains this: <% form_for UserSession.new :url => user_session_path do |f| %>

I get nothing from Authlogic when I hit the Login button with no credentials entered.

But when I revert to its original form:

<% form_for @user_session, :url => user_session_path do |f| %>

Authlogic gives me the following response: