我希望这是显而易见的事情,我一直都忽略了,社区可以让我走上正确的道路。
我有一篇新闻文章控制器,但我希望能够在不同的视图上使用“常用”滚动条列表。如果我在几个控制器中使用partial,我该如何初始化这个“@article_list”?显然,它认为使用帮助程序不是解决方案,因为帮助程序仅用于视图逻辑。那么我在哪里可以将每个控制器提供的初始化程序作为所需?我不应该把它们放在应用程序控制器中吗?
答案 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
这个课程可以放在lib
,app/models
,app/query_objects
,app/models/query_objects
,只要它对您有意义。这有点像The Rails Way,所以没有关于这些类型的对象应该存在的惯例。
然后在你需要的任何控制器中,执行:
@article_list = ArticleList.new.ticker_articles
有关查询对象的更多说明,请参阅this codeclimate article#4。根据您设置@article_list
的操作,这也可能被称为服务对象(#2)或完全不同的东西。不管你怎么称呼它,它的责任是返回@article_list
所需的值,就是这样。