2014-10-10 11 views
0

假设有一个Photos模型。对于这个模型,我有几个观点:最近的照片,流行的照片,最喜欢的照片等。我怎么去创建这个模型的控制器。有不同的选择:如何构建必须以多种方式呈现的模型的控制器?

  1. 一个与index行动PhotosController。我向索引操作发送参数,并根据此参数控制器向数据库发出查询并返回@photos到视图。这有一个缺点,index行动将变得相当大。

  2. 与上面相同,但是决定将哪个查询提取到服务中的逻辑,以便控制器保持精简。

  3. 一个PhotosController有几个动作recent,popular, favorite等,但这不是很安宁。

  4. index操作中的多个控制器 - RecentPhotosControllerPopularPhotosController等。在这种情况下,虽然我还必须有一个正常的PhotosController到喊得showedit行动。

是否有一个既定的最佳实践和选择其中一个选项时有哪些考虑因素?

回答

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 
+0

OK,听起来不错。还有一个问题 - 如何将参数传递给索引操作。我想要有一个链接到不同列表的链接菜单,链接将使用'photos_path(sort_type:'recent')''来构建。所以参数将在链接中被硬编码。这是正确的方法吗? – 2014-10-10 06:43:21

+2

是的,这看起来不错 – apneadiving 2014-10-10 06:49:29

相关问题