2014-02-23 83 views
0

我將過濾功能放入應用程序(Rails 4.1beta) - 我通過在Item模型上創建作用域,通過請求參數傳遞作用域並在索引行動。這一切都有效,但是我試圖擺脫其中一個控制器的索引操作中的代碼味道;減少軌道控制器中的作用域過濾器

def index      
    case params[:scope]   
    when "recent"    
     @items = Item.recent 
    when "active" 
     @items = Item.active 
    when "inactive" 
     @items = Item.inactive 
    else 
     @items = Item.all 
    end 
end 

這一切都覺得有點過於僵硬/冗長。我真的很想做這樣的事情;

def index 
    @items = Item.send(params[:scope]) 
end 

但是隨後我將應用程序全部公開給調用Item類的方法的人。在那裏的打擊條件有點擊敗了我想要實現的目標。

是否有一些軌道魔法我錯過了,可以幫助我嗎?

回答

1

您可以使用不同的控制器來完成其中的每一個。

inactive_items_controller.rb

def index 
    @items = Item.inactive 
end 

recent_items_controller.rb

def index 
    @items = Item.recent 
end 

或者你可以打動你,你有上面的模型

項目模型

邏輯
def self.custom_scope(scope) 
    case scope 
    when "recent"    
    Item.recent 
    when "active" 
    Item.active 
    when "inactive" 
    Item.inactive 
    else 
    Item.all 
    end 
end 

def self.custom_scope(scope) 
    recent if scope == 'recent' 
    active if scope == 'active' 
    inactive if scope == 'inactive' 
    scoped if scope.blank? 
end 

,然後在指數

@items = Item.custom_scope params[:scope] 
0

是這樣的:

if ['recent', 'active', 'inactive'].include?(params[:scope]) 
    @items = Item.send(params[:scope]) 
else 
    @items = Item.all 
end