我正在使用 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
生成表单时。如this answer中所述,我的表格代码为:
<%= 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
。
我知道我可以手动覆盖该方法,但我发现很难相信这是我需要做的。有什么建议吗?
答案 0 :(得分:8)
这是完全正确的。看看这个:
它只是一个Rails解决方案,并非所有浏览器都支持PUT方法。所以Rails模拟POST方法,但知道它确实是一个PUT。
如果你最好检查一下你的表格,你会发现一个隐藏的字段:
<input name="_method" type="hidden" value="put" />
答案 1 :(得分:1)
HTML form tag
仅将get or post
作为method
属性的值。
请参阅 Documentation for form tag 。
为了支持RESTful
以外的GET and POST(already supported by form)
路由,即PATCH, PUT and DELETE requests
,Rails会通过在表单中创建hidden input field
来解决此问题。决定HTTP请求的类型。
例如:
<input name="_method" type="hidden" value="patch" />
答案 2 :(得分:0)
By default form_for助手使用POST。但是form_for方法可以检测传递给它的对象是否已经持久化。如果它已持久化,则它会识别您正在进行编辑并在表单上指定PATCH方法。如果它没有自动使用POST!我希望这有帮助!