繁体   English   中英

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

[英]How do I submit the results of this form to a method?

提交此表单时出现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"

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

post "/dashboard/reset_password/email" => "docs#reset_password", :as => :reset_password

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

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

更改路线,如下所示:

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

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

第二部分,您需要稍微调整一下表单。 您无需将:email符号传递到路径。 在这种情况下,我实际上不确定会为您做什么。 您会在控制器(params [:email])的params哈希中获取电子邮件,因为您的表单中有一个email字段。

更改您的窗体,如下所示:

<%= 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”能够正常读取它。

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

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM