接管资源未使用的 HTTP 方法

Taking over an unused HTTP method of a resource

我有一个 restful Rails 4.2.1 控制器,其路由如下:

resources :users do
  resources :labels, only: %w(index show update destroy)
end

因为这个控制器的模型非常小(只有一个名称、一个 ID 和一些你不会用这个控制器编辑的关联),我想通过 PUT 支持批量编辑正在或 PATCH正在 /users/:user_id/labels 路线。 (PUTPATCH 在集合中未使用,并捕获我试图实现的语义——即编辑整个集合。)

问题是,我不知道该怎么做。我可以这样说:

resources :users do
  resources :labels, only: %w(index show update destroy) do
    collection do
      patch 'all', to: 'labels#update_many'
    end
  end
end

但这会导致 /users/:user_id/labels/all 的路线。将名称字符串留空或 nil 似乎无声地失败(rake routes 不显示任何路由指示),完全省略它会导致错误。同时,做这样的事情:

resources :users do
  resources :labels, only: %w(index show update destroy)
  member do
    patch 'labels', to: 'labels#update_many'
  end
end

导致路由 /users/:id/labels,这几乎是正确的,除了用户 ID 以 :id 而不是 :user_id 的形式出现,这使得很难处理获取用户对象。

我想我可以在根级 match 命令中对整个路由进行硬编码,但这感觉不对。

这样做有什么我不知道的技巧吗?

试试这个:

resources :users do
  resources :labels, only: %w(index show update destroy)
  patch 'labels', to: 'labels#update_many'
end

结果路线为:

PATCH      /users/:user_id/labels(.:format)          labels#update_many

这个小技巧也有效:

resources :labels, only: %w(index update destroy) do
  root to: 'labels#update_many', via: [:patch, :put], as: ''
end

当你这样做的时候,它想要生成一个冗余的user_labels_root_path helper; as: '' 抑制了那个。

但是,上面 Dabrorius 的回答更清晰,所以我将改用那个答案(修改以匹配 PATCHPUT)。