2011-06-11 50 views
2

我試圖讓這個我可以有一個網址,像這樣:Rails 3中問題的路線約束

/events 
/events/sunday # => The day is optional 

然而,它似乎並沒有被連工作雖然我知道它是越來越調用。它位於我的路線文件的底部。

match '/:post(/:day_filter)' => 'posts#index', :as => post_day_filter, :constraints => DayFilter.new 


class DayFilter 

    def initialize 
     @days = %w[all today tomorrow sunday monday tuesday wednesday thursday friday saturday] 
    end 

    def matches?(request) 
     return @days.include?(request.params[:day_filter]) if request.params[:day_filter] 
     true 
    end 

end 

這裏是我的耙路輸出:

post_day_filter  /:post(/:day_filter)(.:format)   {:controller=>"posts", :action=>"index"} 
+0

「似乎沒有工作」有點模糊。小心解釋一下嗎?共享'rake routes'的輸出對路由相關的問題總是有幫助的。 ;) – coreyward 2011-06-11 03:42:32

+0

我貼了它,但我認爲它不會太有幫助。它已經在我的路由文件的底部,並且我已經將調試器放入了我的約束對象中,以確保它被調用,並且它是。它甚至似乎正在返回正確的值。 – Dex 2011-06-11 03:48:33

+0

什麼是/意外發生?我假設你對「/ events/sunday」的請求正在返回404s,但這只是一個猜測。 – coreyward 2011-06-11 03:51:09

回答

5

我不知道是什麼問題,具體而言,但下面是做同樣的事情的更多性能友好的方式:

class ValidDayOfWeek 
    VALID_DAYS = %w[all today tomorrow sunday monday tuesday wednesday thursday friday saturday] 
    def self.matches?(request) 
    VALID_DAYS.include? request.params[:day_of_week] 
    end 
end 

get ':/post_type(/:day_of_week)' => 'posts#index', :constraints => ValidDayOfWeek 

最大的不同是,這避免了在每次請求初始化一個新ValidDayOfWeek對象。 Rails指南給出了一個示例,您可以在可能每次都需要一個新對象(實時黑名單更新),但它對您的情況具有誤導性。

此外,您的matches?方法中有點冗長 - 無需顯式返回或條件,因爲includes?將按原樣返回true或false。

+0

良好的性能提示,我沒有意識到'初始化'。你也在'(:/ day_of_week)'上輸錯了' – Dex 2011-06-11 04:00:56

+0

你是對的。固定! – coreyward 2011-06-11 04:03:02

+0

要記住的一件事是day_of_week是可選的。所以你重寫它的方式是行不通的,因爲零值是完全沒問題的。 – Dex 2011-06-11 04:38:03