为什么当我显式调用“PUT”时,Rails表单总是返回“POST”



下面是我的例子,它们产生了相同的结果:

# `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标记只允许使用GETPOST方法。另请参阅此处了解更多解释。然而,Rails有自己的方法来处理GET/POST/PUT/PATCH请求。如果您检查Rails中定义为form_forform_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仍然在幕后进行这种转换。

最新更新