我尝试根据this railscast为Rails创建域通配符路由。但是我想和#34;范围"本机路由中的功能,例如
domain ':city_id.mysite.com' do
root :to => "cities#test"
end
恕我直言,它看起来比正则表达式更漂亮,但我懒得为#34;:city_id.mysite.com"这样的路径编写解析器。我自己一个人。我相信它已经存在于rails中的某个地方,但我无法在源代码中找到它。 也可以使用:约束,:as,:范围和此路线的其他配置,但htis是可选的。
现在我的代码如下:
module Domain
class Match
def initialize(wildcard, *options)
@wildcard = wildcard
end
def matches?(request)
request.path_parameters[:city_id] = request.subdomain #to replace this with setting parameters from wildcard, :default and so on
request.subdomain.present? #to replace this string with wildcard-match condition
end
end
module Mapper
def domain(wildcard='')
constraints(Domain::Match.new wildcard) { yield }
end
end
end
ActionDispatch::Routing::Mapper.send(:include, Domain::Mapper)
因此,我只能为子域创建路由
domain 'subdomain' do
root :to => "cities#test"
end
我只能获得硬编码参数' city_id'在控制器
答案 0 :(得分:0)
好吧,也许对某人有用。我发现,Journey :: Path :: Pattern可以用于此。添加到初始化:
@pattern = Journey::Path::Pattern.new(
Journey::Router::Strexp.compile(path, constraints, ['.'])
)
检查时 -
match_data = @pattern.match(request.host)
return false if match_data.nil?