Rails控制器动作重复

时间:2014-01-20 18:20:20

标签: ruby-on-rails controller routing renderpartial deduplication

我有一个控制器显示动作,可以执行一些操作并呈现视图,但由于某些自定义路由,我需要在完全不同的控制器中执行完全不同的操作来执行相同的操作并呈现相同的视图。

我真的不想复制代码。有什么地方我可以把它从两个地方调用吗?

编辑:

我基本上需要从Collection#Show AND以及Gallery#SplitUrl:

运行以下内容
@collection = Collection.find_by_id(params[:id])
if @collection.has_children?
  @collections = @collection.children
else
  redirect_to [@collection, :albums]
end

我不能只在{#1}}收藏#显示在Gallery#SplitUrl的末尾,因为重定向导致我的自定义网址丢失,因为这是一个新请求。

2 个答案:

答案 0 :(得分:0)

您可以将视图内容放入部分(/app/views/home/_example.html.erb),然后使用HomeController中的render "example"命令。

您谈到的“一些东西”代码可以放入帮助文件/app/helpers/...,以避免在两个独立的控制器中复制代码,尽管它可能取决于代码在第一个代码中尝试执行的操作的地方。

http://guides.rubyonrails.org/layouts_and_rendering.html

这可能会提供有关该主题的更多信息。

答案 1 :(得分:0)

我认为最简单的方法是为新url添加路线定义,并将其映射到现有controller的{​​{1}}。

如下所示:

action

请注意,这会为您提供# config/routes.rb # Existing resource resources :foos # The resource in question resources :bars do get :show, controller: 'foos', action: 'show', as: bar_foo_common_show end ,其中/bar/:id代表id资源。因此,在您的bar操作中,您的查找程序需要在适当的类上执行。这是为了添加几行hacky代码,例如检查请求引用者。

我认为将公共代码移动到可能foo#show中的函数并从application_controller两个动作调用该函数将是更清晰的方法,但根据我的理解,您已经有类似的情况,除了show中的常用代码,并希望尝试不同的方法!