我有一个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,并且在那里工作正常。
提前致谢。
答案 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)
要记住一些要点---
例如: -
<form class="group" action="<%= password_reset_url(@your_model.id) %>" method="PATCH">
希望它能帮助:)