【发布时间】:2014-06-01 11:27:16
【问题描述】:
我的 Rails 应用中有一个酒店资源。我为一些附加功能添加了一些自定义的非 RESTful 操作。
我有以下 routes.rb 文件:
resources :hotels do
post 'sort', on: :collection
post 'update_hotel_settings', on: :collection
end
这是rake routes的输出:
....
sort_hotels POST /hotels/sort(.:format) hotels#sort
update_hotel_settings POST /hotels/update_hotel_settings(.:format) hotels#update_hotel_settings
hotels GET /hotels(.:format) hotels#index
POST /hotels(.:format) hotels#create
new_hotel GET /hotels/new(.:format) hotels#new
edit_hotel GET /hotels/:id/edit(.:format) hotels#edit
hotel GET /hotels/:id(.:format) hotels#show
PUT /hotels/:id(.:format) hotels#update
DELETE /hotels/:id(.:format) hotels#destroy
update_hotel_settings 操作是将一些常规设置保存到数据库的位置。 这是发送到该操作的表单的开始:
<%= simple_form_for(@store, url: update_hotel_settings_hotels_path, html: {class: 'form-horizontal', id: 'hotel-settings-form'}) do |f| %>
给予:
<form accept-charset="UTF-8" action="/hotels/update_hotel_settings" class="simple_form form-horizontal" id="hotel-settings-form" method="post" novalidate="novalidate">...
但是,在提交表单后,POST 请求被酒店的 REST 更新操作捕获,但网络能够找到 id="update_hotel_settings" 的酒店的例外情况。
显然这是一个不需要的结果,我似乎找不到它的原因。 更新操作不应该由 PUT/PATCH 方法触发,而不是 POST 吗?我还尝试为路线+操作使用另一个名称,而不是“update_hotel_settings”,但没有成功。
最烦人的是上面列出的排序操作运行良好! (唯一的区别是“排序”操作是通过 ajax 触发的,但不确定这是否重要)
编辑:
与您的想法相反,嵌套路由映射器实际上优先于资源的 7 条默认路由。
编辑 2:另一个线索,另一个问题!
起初我很尴尬地注意到我忘记了 simple_form_for 参数中的method: :post 选项,当我添加它时 - Kapow!表单路由到正确的操作!是不是很奇怪?特别是当表单标签中已经有一个 method="post" 属性时!
发生了什么事?
【问题讨论】:
-
与你所说的相反,你的
rake routes向你展示了实际的路线顺序...... -
那我很糟糕,我正在编辑它,没有意识到订单很重要。未经编辑的输出现已发布
标签: ruby-on-rails ruby-on-rails-3 routing