我正在尝试使用Devise在应用中实现密码重置功能。我正处于“忘记密码”链接工作的位置(因为它发送电子邮件),电子邮件中包含“更改我的密码”的链接。
更改密码链接工作并将您发送到表单(在URL http://localhost:3000/users/password/edit?reset_password_token=c7cKb4hMhSLRs72n9dYj
),询问新密码(并进行确认),但在输入新密码并单击“填写我的密码”后,它会重定向到localhost:3000/users/password
并说“请查看以下问题:”并显示一个带有一个字段的电子邮件,以及一个“发送密码重置说明”的按钮。当然,这是提交您的电子邮件以获取密码重置说明的表单,但它也有一个“不能为空”的错误通知,就像有人点击该字段为空的按钮一样。
我使用教程配置ActionMailer来发送电子邮件,我认为这将是此过程中最困难的部分,但现在我无法弄清楚为什么更改一个人密码的表单不起作用。< / p>
我对Rails很新,这是我第一次使用Devise和ActionMailer,所以如果我没有提供一些必要的信息,我会道歉。只是让我知道,我可以添加任何有用的东西。
感谢。
答案 0 :(得分:7)
好的,所以在今晚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
请求进行处理。