Rails Restful Routing и поддомены
Я задавался вопросом, есть ли какие-либо плагины или методы, которые позволяют мне преобразовывать маршруты ресурсов, которые позволяют мне помещать имя контроллера в качестве поддомена.
Примеры:
map.resources :users
map.resource :account
map.resources :blog
...
example.com/users/mark
example.com/account
example.com/blog/subject
example.com/blog/subject/edit
...
#becomes
users.example.com/mark
account.example.com
blog.example.com/subject
blog.example.com/subject/edit
...
Я понимаю, что могу сделать это с помощью именованных маршрутов, но задавался вопросом, есть ли способ сохранить мой сжатый файл routes.rb.
Ответы
Ответ 1
Лучший способ сделать это - написать простую библиотеку промежуточного программного обеспечения, которая перезаписывает заголовки запросов, чтобы ваше приложение rails получало URL-адрес, который вы ожидаете, но с точки зрения пользователя URL-адрес не изменяется. Таким образом, вам не нужно вносить какие-либо изменения в ваше приложение rails (или файл маршрутов)
Например, стойка lib будет переписываться: users.example.com = > example.com/users
Этот камень должен сделать именно это для вас: http://github.com/jtrupiano/rack-rewrite
ОБНОВЛЕН С ПРИМЕРОМ КОДА
Примечание: это быстро написано, полностью непроверено, но должно установить вас на правильном пути. Кроме того, я не проверил драгоценный камень с переустановкой, который может сделать это еще проще
# your rack middleware lib. stick this in you lib dir
class RewriteSubdomainToPath
def initialize(app)
@app = app
end
def call(env)
original_host = env['SERVER_NAME']
subdomain = get_subdomain(original_host)
if subdomain
new_host = get_domain(original_host)
env['PATH_INFO'] = [subdomain, env['PATH_INFO']].join('/')
env['HTTP_X_FORWARDED_HOST'] = [original_host, new_host].join(', ')
logger.info("Reroute: mapped #{original_host} => #{new_host}") if defined?(Rails.logger)
end
@app.call(env)
end
def get_subdomain
# code to find a subdomain. simple regex is probably find, but you might need to handle
# different TLD lengths for example .co.uk
# google this, there are lots of examples
end
def get_domain
# get the domain without the subdomain. same comments as above
end
end
# then in an initializer
Rails.application.config.middleware.use RewriteSubdomainToPath
Ответ 2
Я думаю, что subdomain-fu плагин - это то, что вам нужно.
С его помощью вы сможете создавать маршруты, такие как
map.resources :universities,
:controller => 'education_universities',
:only => [:index, :show],
:collection => {
:all => :get,
:search => :post
},
:conditions => {:subdomain => 'education'}
Это создаст следующее:
education.<your_site>.<your_domain>/universities GET
education.<your_site>.<your_domain>/universities/:id GET
education.<your_site>.<your_domain>/universities/all GET
education.<your_site>.<your_domain>/universities/search POST
Ответ 3
Это возможно без использования плагинов.
Учитывая структуру каталогов app/controllers/portal/customers_controller.rb
И я хочу иметь возможность вызывать URL-адреса помощников с префиксом portal
, i.e new_portal_customer_url
.
И URL будет доступен только через http://portal.domain.com/customers
.
Затем... используйте это:
constraints :subdomain => 'portal' do
scope :module => 'portal', :as => 'portal', :subdomain => 'portal' do
resources :customers
end
end
Ответ 4
Как упоминалось выше, вы можете сделать это без лишних камней, это действительно просто.
У меня есть стандартное приложение для новых рельсов со свежим пользовательским эшафотом и контроллером панели управления для моего администратора, поэтому я просто иду:
constraints :subdomain => 'admin' do
scope :subdomain => 'admin' do
resources :users
root :to => "dashboard#index"
end
end
Итак, это происходит из этого:
:
вы можете включить другой корень: to = > "{controller} # {action}" вне этого ограничения и области для site.com, который можно было бы назвать контроллером страниц. Это поможет вам:
constraints :subdomain => 'admin' do
scope :subdomain => 'admin' do
resources :users
root :to => "dashboard#index"
end
end
root :to => "pages#index"
Затем будет разрешено:
- site.com
- admin.site.com
- admin.site.com/users
Ответ 5
Райан Бейтс рассказывает об этом в своем Railscast, Subdomains.