【问题标题】:How do I submit the results of this form to a method?如何将此表单的结果提交给方法?
【发布时间】:2013-03-11 23:06:29
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        第二部分,您需要稍微调整一下表单。您不需要将 :email 符号传递给路径。在这种情况下,我实际上不确定这对你有什么好处。您在控制器中的 params 散列 (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”能够很好地读取它。

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

        祝你好运!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-05
          • 2013-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-21
          • 2015-02-07
          • 1970-01-01
          相关资源
          最近更新 更多