Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Devise render sign => up/in form partials elsewhere in code

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.

like image 492
Sterling Duchess Avatar asked Mar 11 '13 20:03

Sterling Duchess


2 Answers

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
like image 196
David Colby Avatar answered Oct 21 '22 21:10

David Colby


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
like image 4
Daniel Sun Yang Avatar answered Oct 21 '22 19:10

Daniel Sun Yang