Rails Restful Routing и Поддомены - PullRequest
       16

Rails Restful Routing и Поддомены

16 голосов
/ 07 сентября 2010

Мне было интересно, есть ли какие-нибудь плагины или методы, которые позволяют мне преобразовывать маршруты ресурсов, которые позволяют мне размещать имя контроллера в качестве субдомена.

Примеры:

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
...

Я понимаю,Я могу сделать это с именованными маршрутами, но подумал, есть ли какой-нибудь способ сохранить мой текущий лаконичный файл rout.rb.

Ответы [ 5 ]

5 голосов
/ 07 сентября 2010

Я думаю, что 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 голосов
/ 03 ноября 2011

Это возможно без использования плагинов.

Учитывая структуру каталогов app/controllers/portal/customers_controller.rb И я хочу иметь возможность вызывать помощников URL с префиксом portal, то есть 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
3 голосов
/ 22 сентября 2010

Лучший способ сделать это - написать простую библиотеку промежуточного программного обеспечения для стойки, которая переписывает заголовки запросов так, чтобы приложение rails получало ожидаемый вами URL, но с точки зрения пользователя URL не меняется. Таким образом, вам не нужно вносить какие-либо изменения в ваше приложение rails (или файл маршрутов)

Например, библиотеку стойки переписывают: 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 голосов
/ 25 мая 2012

Как упомянул ileitch, вы можете сделать это без лишних самоцветов, на самом деле это действительно просто.

У меня есть стандартное приложение fresh rails со свежей пользовательской платформой и контроллером панели мониторинга для моего администратора, поэтому я просто иду:*

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
0 голосов
/ 27 сентября 2010

Райан Бейтс рассказывает об этом в своем Railscast, Субдомены .

...