0

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

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

编辑:

我基本上需要从 Collection#Show 和 Gallery#SplitUrl 运行以下内容:

@collection = Collection.find_by_id(params[:id])
if @collection.has_children?
  @collections = @collection.children
else
  redirect_to [@collection, :albums]
end

我不能只是redirect_toCollection#Show 在 Gallery#SplitUrl 的末尾,因为重定向会导致我的自定义 URL 丢失,因为它是一个新请求。

4

2 回答 2

0

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

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

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

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

于 2014-01-20T18:30:57.763 回答
0

我认为最简单的方法是为您的 new 添加路由定义url并将其映射到您现有controlleraction.

如下所示:

# 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资源。因此,在您的foo#show操作中,您的查找器需要在适当的类上执行。这是添加几行hacky代码的时候,例如检查请求引用者。

我认为将通用代码移动到一个函数中application_controller并从两个操作中调用该函数show会是更简洁的方法,但根据我的理解,除了通用代码之外,您已经有类似的场景application_controller,并且想尝试不同的方法!

于 2014-01-20T18:52:12.600 回答