2010-08-03 100 views
1

我有一個基於兩個條件的路徑路由,即域和子域是特定的值。問題是有多個可能的子域值工作,但我似乎無法將它們作爲數組或散列傳遞。具有多個值選項的條件路由有條件

map.with_options(:conditions => {:domain => AppConfig['base_domain'], :subdomain => 'www'..'www3'}) do |signup| 
    signup.plans '/signup', :controller => 'accounts', :action => 'plans' 
    ...[truncated]... 
end 

上面的例子可以作爲接受WWW,WWW1,WWW2 & www3作爲子域的值。但是,這並不能真正解決我的需求。我需要能夠接受的「值」(什麼),「WWW」和「WWW2」所以我想的東西的延長:

map.with_options(:conditions => {:domain => AppConfig['base_domain'], :subdomain => ['','www','www2']}) do |signup| 

這類似於你將如何設置它在ActiveRecord的但對於路線來說似乎並不一樣。

現在有人知道我可以指定三個不連續的值嗎?

回答

2

如果可以將其呈現爲正則表達式,則可以將其用作條件。將數組轉換爲正則表達式很容易:

:subdomain => Regexp.new(%w[ www www3 ].collect { |p| Regexp.escape(p) }.join('|')) 

既然你只是處理一個簡單的模式,爲什麼不把它表達成這個呢?

:subdomain => /www\d*/ 

需要注意的是通過多種途徑使用正則表達式不應該使用^$就像你通常會被錨定是非常重要的。它們必須完全匹配才能生效,部分匹配將被忽略。

+0

我對正則表達式不太熟悉,但是我知道足夠適用於www#,但除了www和www2之外,我還需要它來響應''(無子域)。換句話說,我需要domain.com/signup,www.domain.com/signup和www2.domain.com/signup才能工作。我無法在沒有子域的情況下進行匹配。 – 2010-08-04 20:32:24

+0

正則表達式是如此強大的工具,值得花時間閱讀更多關於它們的內容。有更簡單的方法來測試你的表達式是否工作或不使用'irb',雖然這可能是好的,就像http://rubular.com/我現在想知道的是,如果你不能HTTP重定向www?到規範domain.com以避免所有這些匹配。一個更好的正則表達式可以是:'/ www \ d * | /'在任何情況下都不會匹配。 – tadman 2010-08-05 13:55:34

+0

太棒了!正則表達式正是醫生訂購的! – 2011-11-18 00:38:12