Ruby on rails REST更新操作捕获的自定义路由

Ruby on rails REST更新操作捕获的自定义路由,ruby-on-rails,ruby-on-rails-3,routing,Ruby On Rails,Ruby On Rails 3,Routing,我的Rails应用程序中有一个酒店资源。我为一些附加功能添加了一些自定义的非RESTful操作 我有以下routes.rb文件: resources :hotels do post 'sort', on: :collection post 'update_hotel_settings', on: :collection end 这是rake路由的输出: .... sort_hotels POST /hotels/sort(.:format)

我的Rails应用程序中有一个酒店资源。我为一些附加功能添加了一些自定义的非RESTful操作

我有以下routes.rb文件:

resources :hotels do
  post 'sort', on: :collection
  post 'update_hotel_settings', on: :collection
end
这是rake路由的输出:

....
              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更新操作捕获,关于net能够找到id为“update\u hotel\u settings”的酒店的例外情况除外

显然这是一个不想要的结果,我似乎找不到它的原因。 更新操作不应该由PUT/PATCH方法触发,而不是POST方法触发吗?我还试着用另一个名字来代替“更新酒店设置”,但没有成功

最让人恼火的是,上面列出的排序操作工作正常!(唯一的区别是“sort”操作是通过ajax触发的,但不确定这是否重要)

编辑:

与您可能认为的相反,嵌套路由映射器实际上先于资源的7条默认路由

编辑2:又一条线索,又一个问题

起初,我很尴尬地注意到,我忘记了simple_form_for的参数中的
method::post
选项,当我添加它时-Kapow!表单路由到正确的操作!很奇怪,不是吗?尤其是当表单标签中已经有method=“post”属性时


发生了什么事?

从上到下捕捉路线。也就是说,如果有匹配,它就会停止。因此,您所要做的就是在更新之前将更新设置路由从资源中取出

match '/hotels/update_hotel_settings', to: 'hotels#update_hotel_settings', via: 'post', as :update_hotel_settings_hotels
resources :hotels do
    [...]

与您可能会说的相反,您的
rake routes
显示了实际的路由顺序…我的错,当时我正在编辑它,没有意识到顺序是重要的。未编辑的输出现在已发布