2013-02-24 2 views
1

Я пытаюсь создать подстановочную карту домена для Rails на основе this railscast. Но я бы хотел сделать так же хорошо, как функция «scope» в собственной маршрутизации, например.Rails routing domain wildcard

domain ':city_id.mysite.com' do 
    root :to => "cities#test" 
    end 

ИМХО это выглядит более красивее, чем регулярные выражения, но я слишком ленив, чтобы написать парсер для траектории, как «: city_id.mysite.com» по моему собственному. Я верю где-то внутри рельсов, он уже существует, но я не могу найти его в исходном коде. Также было бы полезно использовать: constraints,: as,: scope и другие конфигурации для этого маршрута, но 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 

И я могу получить только HARDCODED параметр «CITY_ID» в контроллере

ответ

0

Хорошо, возможно, будет полезно для кого-то. Я нашел, что Journey :: Path :: Pattern можно использовать для этого. Добавление к intializer:

@pattern = Journey::Path::Pattern.new(
     Journey::Router::Strexp.compile(path, constraints, ['.']) 
) 

И при проверке -

match_data = @pattern.match(request.host) 
    return false if match_data.nil?