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

时间:2013-09-15 19:50:23

标签: ruby-on-rails

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

我有一篇新闻文章控制器,但我希望能够在不同的视图上使用“常用”滚动条列表。如果我在几个控制器中使用partial,我该如何初始化这个“@article_list”?显然,它认为使用帮助程序不是解决方案,因为帮助程序仅用于视图逻辑。那么我在哪里可以将每个控制器提供的初始化程序作为所需?我不应该把它们放在应用程序控制器中吗?

2 个答案:

答案 0 :(得分: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

<强>更新

确实,胖AppController会出现问题。为了避免它,可以使用模块(几乎@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

并且

答案 1 :(得分:0)

你可以创建一个查询对象,它只负责返回@article_list所需的内容,例如,建立Psylone的答案:

class ArticleList
  def ticker_articles
    ArticleList.all # or any onther selection
  end
end

这个课程可以放在libapp/modelsapp/query_objectsapp/models/query_objects,只要它对您有意义。这有点像The Rails Way,所以没有关于这些类型的对象应该存在的惯例。

然后在你需要的任何控制器中,执行:

@article_list = ArticleList.new.ticker_articles

有关查询对象的更多说明,请参阅this codeclimate article#4。根据您设置@article_list的操作,这也可能被称为服务对象(#2)或完全不同的东西。不管你怎么称呼它,它的责任是返回@article_list所需的值,就是这样。