【问题标题】:custom route caught by REST update actionREST 更新操作捕获的自定义路由
【发布时间】: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


【解决方案1】:

从上到下捕获路线。意思是,如果有匹配,它就会停止。因此,您所要做的就是将 update_hotel_settings 路由从资源中取出并放在它之前。

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

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多