Вам не нужно обрабатывать это перед запросом. У вас есть два типа URL: blogcrea.com/[blogname]/[other params]
и [customdomain]/[other params]
Лучший способ справиться с этим - использовать два набора маршрутов в зависимости от домена:
constrains(CheckIfBlogCrea) do
match '/:blog(/:controller(/:action(/:id)))' # Build your routes with the :blog param
end
match '/(:controller(/:action(/:id)))' # Catch the custom domain routes
Сопоставитель для общего домена:
module CheckIfBlogCrea
def self.matches?(request)
request.host == 'blogcrea.com'
end
end
Теперь вы знаете, что маршруты всегда будут совпадать. Конечно, вы все равно должны знать, какой блог показывать. Это можно легко сделать в ApplicationController
с помощью before_filter
class ApplicationController < ActionController::Base
before_filter :load_blog
protected
def load_blog
# Custom domain?
if params[:blog].nil?
@blog = Blog.find_by_domain(request.host)
else
@blog = Blog.find_by_slug(params[:blog])
end
# I recommend to handle the case of no blog found here
end
end
Теперь в ваших действиях у вас будет объект @blog
, который сообщает вам, какой это блог, он также доступен в представлениях при рендеринге.