Rails Devise: how to put login form and recovery password on one page?

My template looks like this:

.dropdown.light .login =form_for("user", :url => user_session_path) do |f| = f.hidden_field :redirect_to, :value => request.fullpath = f.email_field :email, :placeholder => "email", :size => '' = f.password_field :password, :placeholder => "password", :size => '' div.remember = f.check_box :remember_me, :checked => "checked" = f.label :remember_me .clearfix a.forgot.pull-left href="#forgot" Forgot your password? input.pull-right type="submit" value="Sign in" .forgotten =form_for(:user,:as => :user_forgot, :url => password_path(:user), :html => { :method => :post }) do |f| p strong Reset your password p.small Give us your e-mail and you'll be back in a jiffy div= f.email_field :email .clearfix a.forgot.nevermind.pull-left href="#forgot" Nevermind input.pull-right type="submit" value="Reset password" .sent p strong Email sent! p In a couple of minutes you should receive an email with a link to reset your password 

It really works, but it generates two forms with duplicate identifiers, such as ...

 <input id="user_email" name="user[email]" size="30" type="email"> 

How can I change this so that identifiers are not duplicated?

+6
source share
2 answers

You can add a namespace to your forms.

 =form_for(:user, :as => :user_forgot, :url => password_path(:user), :namespace => 'forgot', :html => { :method => :post }) do |f| 
+5
source

If you don't like the use of namespaces, you can try the AJAX request. This ensures that you can rename fields when generating a POST request.

Or you can override the default PasswordsController of Devise and write your own password recovery method. For your redefinition, you can simply take the code of some methods from {RubyFolder} /lib/ruby/gems/1.9.1/gems/devise-2.1.2/app/controllers/devise/passwords_controller.rb and slightly change it for your own (for example rename the expected input parameters).

0
source

All Articles