0

好吧,干!所以我认为向我的所有控制器(在我的例子中是副本)添加新操作(如现有的新操作,编辑)应该很容易。但是如何为所有控制器设置新路由?

不进入 routes.rb 内的“循环”(即 %w().each ...)?

我的意思是,我们想要 DRY 对吧?因此,您不想在每个资源的路由文件中复制您的操作。我想您应该能够轻松扩展默认操作/路由(索引、新建、编辑等)?

谢谢!

4

2 回答 2

0

查看源代码没有办法添加到资源的默认操作中。

但是,正如@juwiley 所说,这些方法只是resources :item创建大量方法的捷径。membercollection

你需要做的就是这样

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
...
于 2012-04-19T18:21:12.623 回答
0

AFIK 默认没有办法做到这一点。您可以猴子补丁资源以包含此功能:

https://github.com/rails/rails/blob/b229bc70e50ec0887c5bb3aaaa9c6ee8af054026/actionpack/lib/action_dispatch/routing/mapper.rb#L982

...但我的直觉是,您最好重新考虑是否可以通过另一种方式创建此功能,因为您想要做的是“脱离轨道”。

一种选择是创建一个接受模型和 id 并创建克隆的 CloneController#new。这似乎会更干燥,并且不需要您在整个地方都使用大量的“clone_article”“clone_blog”“clone_user”路径。

显然,您需要仔细地将可以传入的模型/ID 列入白名单。

于 2012-04-19T14:58:24.417 回答