I'm just starting with Devise and Rails3. I have the Authenetication down and working and understand the basics.
As of now in my Home Controller that represents my Home/Front Page i have two links one that links to Register => sign_up and one that changes depending on login/logout => sign_in/sign_out.
However i dont want to redirect my user to login page. Instead i want to display my login form on my front page. So i have seperated the devise/session/new
template int to a view and a _form.html.erb partial.
And now in my home view i render the login form as so:
<% if user_signed_in? %>
Welcome: <b><%= current_user.username %> (<%= current_user.group.name %>)</b>
<%= link_to "Logout", destroy_user_session_path, :method => 'delete' %>
<% else %>
<%= render 'devise/sessions/form' %> // Rendering the partial here
<%= link_to "Login", new_user_session_path %>
<% end %>
<hr>
This is the code of the partial:
<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
<div><%= f.label :email %><br />
<%= f.email_field :email, :autofocus => true %></div>
<div><%= f.label :password %><br />
<%= f.password_field :password %></div>
<% if devise_mapping.rememberable? -%>
<div><%= f.check_box :remember_me %> <%= f.label :remember_me %></div>
<% end -%>
<div><%= f.submit "Sign in" %></div>
<% end %>
My error is as follows:
NameError in Home#index
Showing devise/sessions/_form.html.erb where line #1 raised:
undefined local variable or method `resource' for #<#<Class:0x614ec68>:0x6157ff8>
Extracted source (around line #1):
1: <%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
2: <div><%= f.label :email %><br />
3: <%= f.email_field :email, :autofocus => true %></div>
4:
I understand why the error happens. It's because the partial it not being given the resource attribute. I used dump(resource)
and it turns out it's a User model/object So i added the following before it:
<% if @user %>
<% resource = @user %>
<% end %>
And added following to my Home controller index method:
def index
@user = User.new
end
However after that i get resource_name error that turns out to simply be :user
and if i set that then i get a problem because of devise_mapping.rememberable?
which i dont know how to provide.
I want to do this properly so i want to avoid messy and unlogical approach that i started.
Take a look at the answer to this question: Devise form within a different controller
The form you are attempting to render with your Home controller relies on helpers defined by Devise that are not accessible from a non-Devise controller.
Adding the necessary helpers to your home_helper.rb should solve your problem:
def resource_name
:user
end
def resource
@resource ||= User.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end
I'm using Devise 3.5.1 and I had to add resource_class as well to get the login form working on a different controller.
I added it to application_helper.rb so it applies to all of my controllers.
def resource_name
:user
end
def resource
@resource ||= User.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end
def resource_class
devise_mapping.to
end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With