使用POST而不是PUT生成Rails更新表单

3

我正在使用Rails 4

我有一个stream模型,它在routes.rb中具有以下路由代码:

namespace :admin do
  resources :streams, param: :stream_id
end

我得到以下路由信息:
    admin_streams GET    /admin/streams(.:format)                  admin/streams#index
                  POST   /admin/streams(.:format)                  admin/streams#create
 new_admin_stream GET    /admin/streams/new(.:format)              admin/streams#new
edit_admin_stream GET    /admin/streams/:stream_id/edit(.:format)  admin/streams#edit
     admin_stream GET    /admin/streams/:stream_id(.:format)       admin/streams#show
                  PATCH  /admin/streams/:stream_id(.:format)       admin/streams#update
                  PUT    /admin/streams/:stream_id(.:format)       admin/streams#update
                  DELETE /admin/streams/:stream_id(.:format)       admin/streams#destroy

对于新的流,没有问题,Rails会为create方法生成正确的表单属性。
我的问题是当我尝试为update生成一个表单时。如此答案中所述,表单的代码如下:

<%= form_for @stream do |f| %>
    :
    :
  <% f.button %>
<% end %>

然而,这是Rails生成的代码:

<form accept-charset="UTF-8" action="/streams/xxxx" class="edit_stream" id="edit_stream_4" method="post">

如您所见,由于某些原因Rails选择的方法是post而不是put

我知道我可以手动覆盖该方法,但我很难相信这是我需要做的。 有没有建议?

3个回答

8

1

HTML form标签只接受get或post作为method属性的值。

请参阅表单标签文档

为了支持除GET和POST(表单已支持)之外的RESTful路由(PATCH、PUT和DELETE请求),Rails通过在表单中创建一个隐藏输入字段来实现绕过,并在稍后跟踪该字段以决定HTTP请求的类型。

例如:

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

0

默认情况下,form_for助手使用POST方法。但是,form_for方法可以检测传递给它的对象是否已经持久化。如果已经持久化,它会识别出你正在进行编辑操作,并在表单上指定PATCH方法。如果没有持久化,则自动使用POST方法!希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接