【问题标题】:Devise - Recoverable (Password Reset)设计 - 可恢复(密码重置)
【发布时间】:2012-01-22 03:50:30
【问题描述】:

我正在尝试允许用户使用 Devise 的 recoverable 选项重置他们的密码。这似乎对我不起作用。

我扩展了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"

知道如何继续吗?我认为使用 recoverable 选项比这更容易。我做错了什么?

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

【问题讨论】:

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


    【解决方案1】:

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

    resources :passwords
    

    直接在您的路由文件中的devise_for 调用下。现在我不确定该行是否有原因,但是当您将其注释掉时,您的问题会消失吗?

    【讨论】:

    • 问题依然存在。没有它,它不会让我访问重置密码页面。它会抱怨没有用户/密码/新的路线。我本来也是这么想的,我在这里找到了那个信息:github.com/plataformatec/devise/wiki/…
    • 我认为主要问题是我正在尝试扩展 Devise::PasswordsController。我希望我不必这样做,我唯一想要的就是重置密码页面不使用我的应用程序布局。
    • 作为记录,我刚刚删除了我所做的一切,并尝试使用标准设计控制器,我修改了我的应用程序布局,使其不会导致错误,并且一切正常。所以我只需要一个从密码重置页面中删除应用程序布局的好方法。
    【解决方案2】:

    为了找到这个旧线程并希望某些页面具有不同布局的人的利益,我在我的 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 %>
    

    【讨论】:

    • 我知道这是/曾经是旧评论,但您可以通过创建自己的 app/views/layouts/devise.html.erb 布局文件来轻松覆盖设计的布局。
    • 感谢您的评论并更新此信息。在我发帖的时候,我还不知道那一点 Rails-magic。
    猜你喜欢
    • 2016-07-29
    • 2013-01-03
    • 2014-01-17
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 2014-05-14
    相关资源
    最近更新 更多