我正在尝试允许用户使用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"
知道我该怎么办吗?我认为使用可恢复选项比这更容易。我做错了什么?
更新 为了记录,我刚刚删除了我所做的一切,并尝试使用标准设计控制器,并修改了我的应用程序布局,以便它不会导致错误,一切正常。所以我只需要一个很好的方法从密码重置页面中删除应用程序布局。
答案 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 %>