Ruby on rails 如何初始化局部视图中的对象以供多个控制器使用?

Ruby on rails 如何初始化局部视图中的对象以供多个控制器使用?,ruby-on-rails,Ruby On Rails,我希望这是我一直忽视的一件显而易见的事情,社区可以让我走上正确的道路 我有一个新闻文章控制器,但我希望能够在不同的视图上使用“通用”的股票代码列表。如果我在几个控制器中使用分部,如何初始化此“@article_list”?显然,它认为使用助手不是解决方案,因为助手只是用于视图逻辑。那么,我应该把每个控制器都可以使用的初始化器放在哪里呢?我不应该把它们放在应用程序控制器中,是吗?您可以使用之前的过滤方法,即类似这样的方法: class ApplicationController < Acti

我希望这是我一直忽视的一件显而易见的事情,社区可以让我走上正确的道路


我有一个新闻文章控制器,但我希望能够在不同的视图上使用“通用”的股票代码列表。如果我在几个控制器中使用分部,如何初始化此“@article_list”?显然,它认为使用助手不是解决方案,因为助手只是用于视图逻辑。那么,我应该把每个控制器都可以使用的初始化器放在哪里呢?我不应该把它们放在应用程序控制器中,是吗?

您可以使用
之前的过滤方法,即类似这样的方法:

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
class ApplicationController
更新:

事实上,fat应用程序控制器将出现问题。为了避免出现这种情况,可以使用模块(请在下面描述它):

模块文章列表
def集合项目列表
@article_list=ArticleList.all#或其他任何选项
结束
结束
类NewsArticleController<应用程序控制器
包括物品清单
在\u筛选器之前:仅设置\u文章\u列表::action1
def行动1
结束
结束
类另一个NewsArticle控制器<应用程序控制器
包括物品清单
在\u筛选器之前:仅设置\u文章\u列表::另一个\u操作1
定义另一个行动1
结束
结束

本质上,您可以创建一个查询对象,该对象只负责返回您需要的
@article\u list
,例如,基于Psylone的答案:

class ArticleList
  def ticker_articles
    ArticleList.all # or any onther selection
  end
end
这个类可以放在
lib
app/models
app/query\u对象
app/models/query\u对象
,只要对你有意义。这有点超出了Rails的方式,因此对于这些类型的对象应该位于何处没有约定

然后在任何需要的控制器中,执行以下操作:

@article_list = ArticleList.new.ticker_articles

有关查询对象的详细说明,请参见#4。根据您在设置
@article_list
时所做的操作,这也可以称为服务对象(#2)或其他完全不同的东西。不管你怎么称呼它,它的责任都是返回你需要的
@article\u list
值,就这样。

从代码设计的角度来看,这不违背所有现代“最佳”实践吗?“设置文章列表”不是应用程序控制器的责任。它实际上属于项目控制器的域。你的例子就是rails吗?看起来最终应用程序控制器将承担比它应该承担的更多的责任——胖?!?我要试一试。谢谢
@article\u list=ArticleList。新建.ticker\u articles
需要“复制”到每个显示具有“article\u list”视图的视图的控制器,对吗?正确。您可以将其与Psylone建议的
前过滤技术相结合。
@article_list = ArticleList.new.ticker_articles