无论指定什么

时间:2016-09-27 05:06:33

标签: ruby-on-rails forms ruby-on-rails-4

我有一个HTML表单,用于密码重置。它的方法是PATCH,它应该点击update的{​​{1}}方法。但是,在提交时,无论指定的PasswordResetController如何,都始终发出GET请求。我可以输入method = method,它总是发出ANYTHINGHERE请求。

我的表格很简单:

GET

我的路线似乎是有序的:

  <form class="group" action="<%= password_reset_url %>" method="PATCH">
    <input type="hidden" name="authenticity_token" value="<%= form_authenticity_token %>">

    <input type="password" class="password-login" name="new_password" placeholder="New Password">
    <input type="password" class="password-login" name="new_password_verify" placeholder="New Password Confirmation">
    <button class="login-button">Reset Password</button>

  </form>

定义为password_reset_index POST /password_reset(.:format) password_reset#create new_password_reset GET /password_reset/new(.:format) password_reset#new edit_password_reset GET /password_reset/:id/edit(.:format) password_reset#edit password_reset PATCH /password_reset/:id(.:format) password_reset#update PUT /password_reset/:id(.:format) password_reset#update

我的控制员:

resources :password_reset, only: [:new, :create, :edit, :update]

创建,新建和编辑所有工作完全正常,但在提交表单时甚至没有进入更新方法。我得到class PasswordResetController < ApplicationController new, edit, create....etc. def update user = ... end end 。有任何想法吗?我觉得我在这里已经筋疲力尽了。

这不是this question的重复,因为正确生成了令牌字符串。令牌字符串也用作No route matches [GET] "/password_reset/longTokenString路由中的id,并且在那里工作正常。

提前致谢。

3 个答案:

答案 0 :(得分:0)

根据HTML标准,您不能添加put作为表单的方法。 method属性的唯一有效值是get和post。 <form method="put">是无效的HTML,会被视为<form>,即发送GET请求。

您还可以使用rails form tag编写表单代码。

答案 1 :(得分:0)

根据rails策略,可以清楚地解释 PUT PATCH 方法之间的区别。

如果您来自以前版本的Rails,您可能想知道为什么RESTful路由的更新操作会映射到HTTP谓词PATCH而不是PUT。在HTTP标准文档RFC 57892中,它概述了对给定资源的PUT请求意味着在源服务器上完全替换它。但是,在Rails中更新资源时,很少(如果有的话)在执行更新时替换整个资源。例如,在更新Active Record模型时,Rails会设置属性updated_at时间戳,而不是请求客户端。

为了遵循更好的HTTP语义,Rails将使用HTTP动词PATCH进行更新。 PATCH允许资源的完全和部分更新,更适合Rails如何更新资源。如果要升级现有的Rails应用程序,HTTP动词PUT仍将映射到更新操作 RESTful路由,但建议使用PATCH前进。

  

我将解释用户编辑选项如何在rails中运行。

应用/控制器/ users_controller.rb

 def edit
    @user = User.find(params[:id])
 end

相应的用户编辑视图

应用/视图/用户/ edit.html.erb

<% provide(:title, "Edit user") %>
<h1>Update your profile</h1>

<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_for(@user) do |f| %>
<%= render 'shared/error_messages' %>

<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>

<%= f.label :email %>
<%= f.email_field :email, class: 'form-control' %>

<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>

<%= f.label :password_confirmation, "Confirmation" %>
<%= f.password_field :password_confirmation, class: 'form-control' %>

<%= f.submit "Save changes", class: "btn btn-primary" %>
<% end %>

查看HTML源代码

<form accept-charset="UTF-8" action="/users/1" class="edit_user"
      id="edit_user_1" method="post">
  <input name="_method" type="hidden" value="patch" />
  .
  .
  .
</form>

注意:请注意隐藏的输入字段:

<input name="_method" type="hidden" value="patch" />
  

形成文档:

method: (:get|:post|:patch|:put|:delete)

“在选项哈希中。如果动词不是GET或POST,HTML表单本身支持,则表单将设置为POST,名为_method的隐藏输入将携带服务器要解释的预期动词。 “

参考:http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

希望我的解释清楚地理解这个概念。快乐编码:)

答案 2 :(得分:0)

要记住一些要点---

  1. 如果您正在使用form_for标记,则不必担心其他任何因为rails本身使用其Record identification来处理创建(POST),新(GET)和更新(UPDATE / PATCH)行动。
  2. 如果你没有统一使用form_for标签,这是你的情况,你必须完全匹配网址,所以你需要传递id
  3. 例如: -

     <form class="group" action="<%= password_reset_url(@your_model.id) %>" method="PATCH">
    

    希望它能帮助:)