我有一个控制器显示动作,可以执行一些操作并呈现视图,但由于某些自定义路由,我需要在完全不同的控制器中执行完全不同的操作来执行相同的操作并呈现相同的视图。
我真的不想复制代码。有什么地方我可以把它从两个地方调用吗?
编辑:
我基本上需要从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的末尾,因为重定向导致我的自定义网址丢失,因为这是一个新请求。
答案 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
中的常用代码,并希望尝试不同的方法!