下面是我的例子,它们产生了相同的结果:
# `enterprise_registration` is an already created/saved object
form_for enterprise_registration, method: :put do |format|; format; end
form_for enterprise_registration, url: logo_url, method: :put do |format|; format; end
form_for enterprise_registration, url: logo_url, html: {method: :put} do |format|; format; end
这将返回method
属性设置为POST
的表单。
你认为为什么会这样?我如何将其作为:put
请求?
更新
我现在知道Rails表单嵌入了一个隐藏的_method
并将其设置为put
,但我的表单仍然以POST
的形式交付,这使我的表单无法找到匹配的PUT
URL
form
标记只允许使用GET
或POST
方法。另请参阅此处了解更多解释。然而,Rails有自己的方法来处理GET/POST/PUT/PATCH
请求。如果您检查Rails中定义为form_for
或form_tag
的任何form
,您会注意到表单的第一个元素是一个隐藏的<div>
,它包含两个隐藏字段:
<div style="display:none">
<input name="utf8" type="hidden" value="✓"><input name="_method" type="hidden" value="patch">
<input name="authenticity_token" type="hidden" value="9i5eRhwhx4NhvSxqIJm6cv9x6NSlY82hpNpfrpk/I0c=">
</div>
第一个名为_method
的字段包含表单操作,它是控制器的请求类型。
Web浏览器实际上只被编程为接收POST和GET请求(我不知道为什么)。Rails模仿完整REST(包括put和delete)的方式是将它们包含在隐藏字段中。所以从技术上讲,它是在发送POST,但PUT附加在隐藏字段中有点尴尬。
我假设Rails仍然在幕后进行这种转换。