Подтвердить что ты не робот

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.

4b9b3361

Ответ 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

Итак, это происходит из этого:

  • site.com/users

:

  • admin.site.com/users

вы можете включить другой корень: 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.