0

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

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

4

2 回答 2

0

您可以使用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

于 2013-09-15T22:25:04.177 回答
0

本质上,您可以创建一个查询对象,该对象仅负责返回您需要的内容@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,仅此而已。

于 2013-09-15T23:30:01.783 回答