我希望这是我一直忽略的显而易见的事情,并且社区可以让我走上正确的道路。
我有一个新闻文章控制器,但我希望能够在不同的视图上使用“通用”代码列表。如果我在几个控制器中使用部分,如何初始化这个“@article_list”?显然,认为使用助手不是解决方案,因为助手只是用于视图逻辑。那么我应该把这个初始化器放在哪里,每个控制器都可以根据需要使用它呢?我不应该把它们放在应用程序控制器中吗?
我希望这是我一直忽略的显而易见的事情,并且社区可以让我走上正确的道路。
我有一个新闻文章控制器,但我希望能够在不同的视图上使用“通用”代码列表。如果我在几个控制器中使用部分,如何初始化这个“@article_list”?显然,认为使用助手不是解决方案,因为助手只是用于视图逻辑。那么我应该把这个初始化器放在哪里,每个控制器都可以根据需要使用它呢?我不应该把它们放在应用程序控制器中吗?
您可以使用before_filter
方法,即这样的:
class ApplicationController < ActionController::Base
def set_article_list
@article_list = ArticleList.all # or any onther selection
end
end
class NewsArticleController < ApplicationController
before_filter :set_article_list, only: :action1
def action1
end
end
class AnotherNewsArticleController < ApplicationController
before_filter :set_article_list, only: :another_action1
def another_action1
end
end
更新:
确实,胖 ApplicationController 会有问题。为了避免这种情况,可以使用模块(几乎@carolclarinet 在下面描述它):
module ArticleList
def set_article_list
@article_list = ArticleList.all # or any onther selection
end
end
class NewsArticleController < ApplicationController
include ArticleList
before_filter :set_article_list, only: :action1
def action1
end
end
class AnotherNewsArticleController < ApplicationController
include ArticleList
before_filter :set_article_list, only: :another_action1
def another_action1
end
end
和
本质上,您可以创建一个查询对象,该对象仅负责返回您需要的内容@article_list
,例如,构建 Psylone 的答案:
class ArticleList
def ticker_articles
ArticleList.all # or any onther selection
end
end
这门课可以进入lib
, app/models
, app/query_objects
, app/models/query_objects
, 任何对你有意义的地方。这有点超出了 Rails 的方式,所以没有关于这些类型的对象应该放在哪里的约定。
然后在您需要的任何控制器中,执行以下操作:
@article_list = ArticleList.new.ticker_articles
有关查询对象的更多说明,请参阅此 codeclimate 文章#4。根据您对 set 所做的操作@article_list
,这也可能被称为服务对象 (#2) 或完全称为其他东西。不管你怎么称呼它,它的职责就是返回你需要的值@article_list
,仅此而已。