2010-09-08 45 views
3

我有兩個命名範圍的事件模型:我可以將命名的作用域附加到Rails中的鏈接嗎?

class Event < ActiveRecord::Base 
    scope :future, lambda { where('events.date >= ?', Time.zone.now) } 
    scope :past, lambda { where('events.date <= ?', Time.zone.now) } 
end 

我通過創建兩個新的控制器動作(名爲「未來」和「過去」)調用從我的控制器,這些示波器:

我控制器:

class EventsController < InheritedResources::Base 
    actions :index, :show, :future, :past 

    has_scope :future 
    has_scope :past 

    def future 
    index! { @events = Event.future } 
    end 

    def past 
    index! { @events = Event.past } 
    end 
end 

我也有這些額外操作的意見和路線。

這工作正常。我的應用我想要做什麼,我可以如下鏈接到我的側邊欄新動作:

%li 
    = link_to 'Events Home', events_path 
%li 
    = link_to 'Future Events', future_events_path 
%li 
    = link_to 'Past Events' past_events_path 

現在我與此設置的問題是,雖然它工作得很好,我不喜歡的事實,我必須爲這些額外的範圍創建新的操作,視圖和路線。我不認爲我以正確的方式做這件事。基本上,我試圖篩選索引頁面上的結果,但我不得不創建新的動作,路線和視圖來做到這一點。這似乎有點麻煩,我想知道是否有另一種方式。

這將是很好,如果我能做到廢除了「未來」和「過去」的控制器動作並調用範圍從這樣的觀點:

%li 
    = link_to 'Events Home', events_path 
%li 
    = link_to 'Future Events', events_path.future 
%li 
    = link_to 'Past Events' events_path.past 

顯然,這是行不通的。我見過an example使用自定義select_tag幫手,但我很能修改它以無選擇標記或JS工作...

是更好地與當前的方法堅持

回答

3

使用基於外部參數的發送有點危險。 我推薦has_scope寶石

5

你可以有隻有索引作用,並通過範圍作爲參數,所以你會做:

Event.send(params[:scope] : 'all') 

範圍可以通過這樣的:

link_to "Future events", events_path(:scope => "future") 
+0

非常感謝,完美的作品 - 它真的有幫助! – stephenmurdoch 2010-09-08 07:44:19

+0

您是否仍然可以在索引操作中使用導軌4或5來執行此操作? – 2016-11-01 23:48:05

相關問題