2014-10-10 39 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

相關問題