设计 - 可恢复(密码重置)

时间:2011-12-16 16:36:29

标签: ruby-on-rails ruby-on-rails-3 passwords devise

我正在尝试允许用户使用Devise的可恢复选项重置密码。这对我来说似乎没有用。

我扩展了Devise::PasswordsController,以便它不使用应用程序布局。

class PasswordsController < Devise::PasswordsController
  layout false
end

在我的路线中,我确保使用我的密码控制器。

devise_for :users, :controllers => {:passwords => "passwords"}
resources :passwords

这是我的用户模型,因此您可以看到我有:recoverable选项。

devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

在我的登录页面上,我(我正在使用haml):

...
= link_to "Forgot your password?", new_password_path(resource_name)

这个链接正确地将我带到http://localhost:3000/users/password/new。这是在那里找到的表格:

%h2 Forgot your password?
= form_for(resource, as: resource_name, url: password_path(resource_name), html: { :method => :post }) do |f|
  = devise_error_messages!
  %div
    = f.label :email
    %br/
    = f.email_field :email
  %div= f.submit "Send me reset password instructions"

然而,当我点击按钮时,这似乎试图把我带到错误的地方。它每次都失败了,并且没有在服务器日志中显示任何电子邮件。

它将我重定向到:http://localhost:3000/passwords/user并告诉我:

路由错误

No route matches "/passwords/user"

知道我该怎么办吗?我认为使用可恢复选项比这更容易。我做错了什么?

更新 为了记录,我刚刚删除了我所做的一切,并尝试使用标准设计控制器,并修改了我的应用程序布局,以便它不会导致错误,一切正常。所以我只需要一个很好的方法从密码重置页面中删除应用程序布局。

2 个答案:

答案 0 :(得分:2)

当您在视图代码中调用password_path(resource_name)时,路由系统认为您的意思是/passwords/resource_name,而不是Devise在users下命名的控制器。这是因为你有一行

resources :passwords

直接在您的路线文件中的devise_for电话下。现在我不确定这条线是否有原因,但是当你发表评论时你的问题会消失吗?

答案 1 :(得分:0)

为了找到这个旧线程并希望某些页面具有不同布局的人的利益,我在app / views / layouts / application.html.erb中使用此方法来去除默认布局。

<% if ( current_page?(what_ever_path)) %>
    <div class="container">
        <%= yield %>
    </div>      

<% else %> 
    <%= render 'layouts/header' %>
    <div class="container">
        <%= yield %>
    </div>
    <%= render 'layouts/footer' %>
<% end %>