我在提交此表单时收到NoMethodError,我不知道如何让它工作。它只是一个密码重置形式,虽然是Devise gem,并且在控制台中尝试@user.send_reset_password_instructions
工作得很好。
以下是我认为的表格:
<%= form_tag reset_password_path(:email), :id => 'forgotten_password' do %>
<%= email_field_tag :email, nil, :placeholder => 'Email address' %>
<%= submit_tag "Reset password" %>
<% end %>
在我的路线中:
get "/dashboard/reset_password/:email" => "docs#reset_password", :as => :reset_password
在我的控制器中:
def reset_password
@user = User.where(:email => params[:email]).first
@user.send_reset_password_instructions
end
这是错误:
No route matches [POST] "/dashboard/reset_password/email"
答案 0 :(得分:2)
你的路线需要有POST方法,而不是GET。它应该是/email
而不是/:email
post "/dashboard/reset_password/email" => "docs#reset_password", :as => :reset_password
答案 1 :(得分:1)
您定义了回复GET
个请求的路由,并且您的表单正在发送POST
个请求。尝试将路线方法从get
更改为post
答案 2 :(得分:0)
所以,第一部分是让你的路线成为POST而不是GET(如前所述)。通常,只要您将数据发送到服务器并导致更改(例如在用户帐户上设置重置密码令牌并向其发送电子邮件),就可以使用POST。
将您的路线更改为:
POST "/dashboard/reset_password" => "docs#reset_password", :as => :reset_password
注意:我还删除了路径中的:email部分。你真的不需要那样。
第二部分,你需要稍微调整你的表格。您无需将:电子邮件符号传递给路径。在这种情况下,我真的不确定那会对你有什么影响。您可以通过控制器(params [:email])中的params哈希获得电子邮件,因为您的表单中有一个电子邮件字段。
将表单更改为以下内容:
<%= form_tag reset_password_path, :id => 'forgotten_password' do %>
<%= email_field_tag :email, nil, :placeholder => 'Email address' %>
<%= submit_tag "Reset password" %>
<% end %>
这应该在表单HTML中生成POST表单路径'/ dashboard / reset_password'。当用户点击页面上的“重置密码”按钮时,表单中的:email字段将提交给您。 Rails会把它塞进params中,你的控制器方法'reset_password'能够很好地读取它。
您可能还想在控制器方法中捕获一些错误。电子邮件密码重置最常见的问题是电子邮件中存在拼写错误,您将无法找到该用户。发生这种情况时,向用户返回消息会很有帮助。
祝你好运!