Rail3 |如何为所有控制器创建标准路由/操作?

时间:2012-04-19 09:50:18

标签: ruby-on-rails-3

嗯,干!所以我认为应该很容易向我的所有控制器添加一个新动作(比如现有的新动作,编辑)(在我的案例中)。但是,如何为所有控制器设置新路径?

没有进入routes.rb内的'循环'(即%w()。each ...)?

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

谢谢!

2 个答案:

答案 0 :(得分:0)

AFIK默认无法做到这一点。您可以使用Monkey补丁资源来包含此功能:

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

...但我的预感是你最好再考虑是否可以用另一种方式创建这个功能,因为你要做的就是“关闭Rails”。

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

显然,您需要仔细列出可以传入的模型/ ID。

答案 1 :(得分: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
...