0

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

3 回答 3

2

您的路线需要包含 POST 方法,而不是 GET。/email它不应该/:email

post "/dashboard/reset_password/email" => "docs#reset_password", :as => :reset_password
于 2013-03-11T23:14:06.203 回答
1

您定义了响应GET请求的路线,并且您的表单正在发送POST请求。尝试将路线的方法从更改getpost

于 2013-03-11T23:12:56.950 回答
0

因此,第一部分是使您的路由成为 POST 而不是 GET(如前所述)。通常,每当您将数据发送到服务器并导致更改(例如在用户帐户上设置重置密码令牌并向他们发送电子邮件)时,您都会使用 POST。

将您的路线更改为如下所示:

POST "/dashboard/reset_password" => "docs#reset_password", :as => :reset_password

注意:我还删除了路径的 :email 部分。你真的不需要那个。

第二部分,您需要稍微调整一下表格。您不需要将 :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 会将其填充到参数中,并且您的控制器方法“reset_password”能够很好地读取它。

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

祝你好运!

于 2013-03-12T03:48:22.553 回答