假设有一个Photos
模型。对于这个模型我有几个视图:最近的照片,流行的照片,最喜欢的照片等..我如何为这个模型创建控制器。有不同的选择:
一个PhotosController
行动index
。我将参数发送到索引操作,并根据此参数,控制器向数据库发出查询并将@photos
返回给视图。这样做的缺点是index
动作会变得很大。
与上述相同,但决定将要进行的查询的逻辑提取到服务中,以便控制器保持精简状态。
一个PhotosController
包含多项操作recent
,popular
,favorite
等,但这不是很安静。
有index
个动作的几个控制器 - RecentPhotosController
,PopularPhotosController
等。在这种情况下,我仍然必须正常PhotosController
才能进行{{1} },show
行动。
是否有针对此的既定最佳实践以及选择其中一个选项时需要考虑的因素是什么?
答案 0 :(得分:2)
我会选择1。
控制器不应该变大:你必须从服务对象中的params创建查询。
类似的东西:
def index
@photos = PhotoQuery.new(params).call
#....
end
class PhotoQuery
attr_reader :params
def initialize(params)
@params = params
end
def call
case params[:type]
when 'recent' then Photo.recent
else Photo.all
end
end
end