好吧,干!所以我认为向我的所有控制器(在我的例子中是副本)添加新操作(如现有的新操作,编辑)应该很容易。但是如何为所有控制器设置新路由?
不进入 routes.rb 内的“循环”(即 %w().each ...)?
我的意思是,我们想要 DRY 对吧?因此,您不想在每个资源的路由文件中复制您的操作。我想您应该能够轻松扩展默认操作/路由(索引、新建、编辑等)?
谢谢!
好吧,干!所以我认为向我的所有控制器(在我的例子中是副本)添加新操作(如现有的新操作,编辑)应该很容易。但是如何为所有控制器设置新路由?
不进入 routes.rb 内的“循环”(即 %w().each ...)?
我的意思是,我们想要 DRY 对吧?因此,您不想在每个资源的路由文件中复制您的操作。我想您应该能够轻松扩展默认操作/路由(索引、新建、编辑等)?
谢谢!
查看源代码没有办法添加到资源的默认操作中。
但是,正如@juwiley 所说,这些方法只是resources :item
创建大量方法的捷径。member
collection
你需要做的就是这样
class ActionDispatch::Routing::Mapper
def resources_with_copy(*resources, &block)
block_with_copy = lambda do
block.call
member do
post :copy
end
end
resources(*resources, &block_with_copy)
end
end
然后在你的 routes.rb 中说
resources_with_copy :items
resources_with_copy :posts do
member do
post :share
end
end
...
AFIK 默认没有办法做到这一点。您可以猴子补丁资源以包含此功能:
...但我的直觉是,您最好重新考虑是否可以通过另一种方式创建此功能,因为您想要做的是“脱离轨道”。
一种选择是创建一个接受模型和 id 并创建克隆的 CloneController#new。这似乎会更干燥,并且不需要您在整个地方都使用大量的“clone_article”“clone_blog”“clone_user”路径。
显然,您需要仔细地将可以传入的模型/ID 列入白名单。