Devise - Sign up and sign in at same view

Hi, I’d like to know what is the best way to do this. Right now I can see two options:

  1. create a new views at make a custom controller for registration controller to redirect to the right path

  2. change the registration views that devise generates for you (so, for example, the new view will have the session view inside it for the sign in too)

Thanks in advance.

I just did this. I let Devise generate the views (rake task, check the wiki) and then I modified the devise/sessions/new layout to combine sign in and sign up.

<%- title "Sign in or sign up" %>

<div class="left half">
  <h3>Already registered?</h3>
<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
  <p><%= f.label :email %><br />
  <%= f.email_field :email %></p>

  <p><%= f.label :password %><br />
  <%= f.password_field :password %></p>

  <% if devise_mapping.rememberable? -%>
    <p><%= f.check_box :remember_me %> <%= f.label :remember_me %></p>
  <% end -%>

  <p><%= f.submit "Sign in" %></p>
<% end %>
</div>
<div class="half left">
  <h3>Create an account</h3>
  <%= render :partial => 'devise/registrations/form' %>
</div>
<div style="clear:both"><%= render :partial => "devise/shared/links" %></div>

Walter

Do you think it is better than create a new view for it?

Do you think it is better than create a new view for it?

I don't know about better, it was expedient and didn't create a third view file.

Walter

I also want to render a different page if the user is loged in.

How should I do that?

Oh, and all that with the root url

root :to => ‘users/sessions/new’

It didn’t work, when I do

devise_for :users do

root :to => “devise/sessions#new”

end

because I want to log in in the root url and then remain there, but with a different rendering (logic is inside the new view of users/sessions)

It keeps trying to redirect to the root url again and again, giving a message “Too many redirects occur…”

What should I do?

Thanks in advance

It didn't work, when I do

devise_for :users do
    root :to => "devise/sessions#new"
end

because I want to log in in the root url and then remain there, but with a different rendering (logic is inside the new view of users/sessions)

It keeps trying to redirect to the root url again and again, giving a message "Too many redirects occur..."

What should I do?

I think you need to re-think how this login will work. If you're trying to log in on a page, and then show that same page again after the user has logged in, what will trigger to the authentication system that the login is necessary?

Devise is abstracted around solving this particular problem: User arrives at a page that she needs to be authenticated in order to see. She is redirected to a login page, authenticates, and then is redirected back to the originally requested page. If you're not trying to do that, then you have to add on to that behavior, not replace it, or you won't have much benefit to using this framework.

Try this. Follow the examples (RailsCast has a very nice treatment of Devise, goes into all the nooks and crannies in two parts) and build the normal authentication system. Be sure to set a root page that is not the login path. Then add a *login form* to your root page (and optionally hide it if the user is logged in) using render partial in your view. This will be used to authenticate people who *want to* sign in before they are *required to* sign in.

Walter

Hello Rodrigo,

if you need to redirect the user after login, there is a method in devise that make it. You should take a look in the documentation first, but the method is after_sign_in_path_for()

cheers

The problem is that I want to redirect to the same url (meaning, I don’t want to redirect, just want to go to the same route, and it will render a different view because I did this in the view with an “if user_sign_in?”)