【问题标题】:Devise change password form not working设计更改密码表格不起作用
【发布时间】:2013-11-08 02:08:46
【问题描述】:

我正在尝试使用 Devise 在应用中实现密码重置功能。我正处于“忘记密码”链接起作用的地方(因为它发送电子邮件),并且电子邮件包含“更改我的密码”的链接。

更改密码链接有效,并将您发送到一个表单(在 URL http://localhost:3000/users/password/edit?reset_password_token=c7cKb4hMhSLRs72n9dYj),要求输入新密码(并确认),但在输入新密码并单击“更改我的密码”后,它重定向到localhost:3000/users/password 并说“请查看以下问题:”并提供一个来自电子邮件的一个字段,以及一个用于“发送密码重置说明”的按钮。这当然是提交邮件获取密码重置说明的表单,但也有“不能为空”的错误提示,好像有人点击了字段为空的按钮。

我使用了一个教程来配置 ActionMailer 以发送电子邮件,我认为这将是这个过程中最困难的部分,但现在我无法弄清楚为什么更改密码的表单不起作用。

我对 Rails 很陌生,这是我第一次使用 Devise 和 ActionMailer,所以如果我没有提供一些需要的信息,我深表歉意。请告诉我,我可以添加任何有帮助的内容。

谢谢。

【问题讨论】:

  • 我不认为 actionmailer 是这里的问题,特别是因为你说它可以很好地发送电子邮件。否则它不会向您显示表格。可以分享一下重置密码的控制器代码吗?
  • 我也是这么想的,但我不知道如何查看控制器的密码,因为我认为它内置于设计中。我可以通过运行rails g devise:views 来显示设计视图,但我认为显示设计控制器是不可能的。
  • 那你能显示passwords#edit吗?还有你用的是什么版本的设计?
  • 我很确定我正在运行 2.2。在我的 gemfile 我有gem 'devise',所以我认为它应该运行最新版本(我认为是 2.2)。我不知道如何显示passwords#edit。这不代表编辑密码的路径吗?不过,当我在终端中运行rake routes 时,我确实有edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
  • 好的,我想我找到了设计控制器here,它的编辑方法有以下代码:def edit self.resource = resource_class.new resource.reset_password_token = params[:reset_password_token] end

标签: ruby-on-rails forms email devise passwords


【解决方案1】:

好的,在今晚参加 Rails 会议的人的帮助下,我发现了问题所在。它实际上与控制器或路由没有任何关系,而是我通过错误地向表单添加了一些代码而导致了这个错误。这是我的表单的更正代码:

<h2>Change your password</h2>

<%= simple_form_for(resource, :as => resource_name, :url => password_path(resource_name),
         html: { method: :put, class: "pure-form pure-form-stacked" }) do |f| %>
  <%= f.error_notification %>

  <%= f.hidden_field :reset_password_token %>

  <%= f.input :password, label: "New password", autofocus: true, required: true %>
  <%= f.input :password_confirmation, label: "Confirm new password", required: true %>

  <div><%= f.submit "Change my password", class: "pure-button" %></div>
<% end %>

<%= render "devise/shared/links" %>

我的问题是,我没有将 class: "pure-form pure-form-stacked 行作为第二个键/值对包含到 html: {} 中,而是有第二个 html: {} 行。

如果不清楚,我有这个:

html: { method: :put },
html: { class: "pure-form pure-form-stacked" }

而不是这个:

html: { method: :put, class: "pure-form pure-form-stacked" }

由于某种原因,在第一个版本中,只有第二个 html: {} 与表单一起提交,因此它没有被处理为 put 请求。

【讨论】:

    猜你喜欢
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2020-04-12
    • 2015-08-06
    • 2016-12-11
    • 2011-11-29
    相关资源
    最近更新 更多