如何将此表单的结果提交给方法?

时间:2013-03-11 23:06:29

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

我在提交此表单时收到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"

3 个答案:

答案 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'能够很好地读取它。

您可能还想在控制器方法中捕获一些错误。电子邮件密码重置最常见的问题是电子邮件中存在拼写错误,您将无法找到该用户。发生这种情况时,向用户返回消息会很有帮助。

祝你好运!