В момента, ако искате да добавите ограничение, има много начини да го направите, но както виждам в момента можете да включите само един окончателен метод, който се извиква. напр.
Class Subdomain
# Possible other `def`s here, but it's self.matches? that gets called.
def self.matches?( request )
# Typical subdomain check here
request.subdomain.present? && request.subdomain != "www"
end
end
Проблемът с горния подход е, че той не обработва маршрути с префикс в www, тоест admin и www.admin са неразличими. Може да се добави още логика, но ако това е било необходимо за набор от статични поддомейни като admin, support и api, в момента трябва да направите SubdomainAdmin, SubdomainSupport и т.н.
Това може да се реши с регулярен израз, както следва в routes.rb
:
администратор
:constraints => { :subdomain => /(www.)?admin/ }
api
:constraints => { :subdomain => /(www.)?api/ }
Ако заявките бяха още по-сложни от това, нещата стават трудни. И така, има ли начин да добавите отделни методи вътре в клас, използван за ограничения?
По същество как се постига следното? Възможно ли е изобщо? Кой е най-добрият метод за използване на поддомейни в бял списък?
E.g.
Class Subdomain
def self.admin_constraint( request )
# Some logic specifically for admin, possible calls to a shared method above.
# We could check splits `request.subdomain.split(".")[ 1 ].blank?` to see if things are prefixed with "www" etc....
end
def self.api_constraint( request )
# Some logic specifically for api, possibly calls to a shared method above.
# We could check splits `request.subdomain.split(".")[ 1 ].blank?` to see if things are prefixed with "www" etc....
end
def self.matches?( request )
# Catch for normal requests.
end
end
С което вече можем да извикаме ограничения конкретно, както следва:
:constraints => Subdomain.admin_constraints
И всички общи ограничения, както следва:
:constraints => Subdomain
Възможно ли е това в Rails 4.0.3?