接管资源未使用的 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
路线。 (PUT
和 PATCH
在集合中未使用,并捕获我试图实现的语义——即编辑整个集合。)
问题是,我不知道该怎么做。我可以这样说:
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 的回答更清晰,所以我将改用那个答案(修改以匹配 PATCH
和 PUT
)。
我有一个 restful Rails 4.2.1 控制器,其路由如下:
resources :users do
resources :labels, only: %w(index show update destroy)
end
因为这个控制器的模型非常小(只有一个名称、一个 ID 和一些你不会用这个控制器编辑的关联),我想通过 PUT
支持批量编辑正在或 PATCH
正在 /users/:user_id/labels
路线。 (PUT
和 PATCH
在集合中未使用,并捕获我试图实现的语义——即编辑整个集合。)
问题是,我不知道该怎么做。我可以这样说:
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 的回答更清晰,所以我将改用那个答案(修改以匹配 PATCH
和 PUT
)。