1

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

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

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

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

谢谢。

4

1 回答 1

8

好的,所以在今晚参加 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请求处理。

于 2013-10-30T04:03:01.270 回答