2010-08-03 103 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