Создание маршрута rails к внешнему URL-адресу в Rails 4

У меня есть куча маршрутов (~ 50), которые необходимо сопоставить с внешним URL-адресом. Я определенно могу сделать так, как предложено в здесь, но это будет беспорядок мой файл route.rb. Могу ли я каким-либо образом иметь их в файле конфигурации и ссылаться на него из моего файла route.rb?

Кроме того, при сопоставлении с внешним URL-адресом, если это не производственная среда, его необходимо сопоставить с «http:example-test.com/..», а в рабочем режиме его необходимо сопоставить с «http:example.com/». ..». Я знаю, что у меня может быть файл yml в конфигурации, который работает с разными средами. Но как мне получить к нему доступ в моем файле route.rb?


person user2452057    schedule 12.10.2015    source источник


Ответы (2)


Сначала давайте создадим пользовательскую переменную конфигурации для внешнего хоста:

# config/application.rb
module MyApp
  class Application < Rails::Application
    config.external_host = ENV["EXTERNAL_HOST"]
  end
end

А затем давайте настроим его для каждой среды:

# config/environments/development.rb
Rails.application.configure do
  # ...
  config.external_host ||= 'dev.example.com'
end

# config/environments/test.rb
Rails.application.configure do
  # ...
  config.external_host ||= 'test.example.com'
end

# config/environments/production.rb
Rails.application.configure do
  # ...
  config.external_host ||= 'example.com'
end

Затем настраиваем маршрут:

Rails.application.routes.draw do
  # External urls
  scope host: Rails.configuration.external_host do
    get 'thing' => 'dev#null', as: :thing
  end
end

И давайте попробуем:

$ rake routes
Prefix Verb URI Pattern      Controller#Action
 thing GET  /thing(.:format) dev#null {:host=>"dev.example.com"}
$ rake routes RAILS_ENV=test
Prefix Verb URI Pattern      Controller#Action
 thing GET  /thing(.:format) dev#null {:host=>"test.example.com"}
$ rake routes RAILS_ENV=production
Prefix Verb URI Pattern      Controller#Action
 thing GET  /thing(.:format) dev#null {:host=>"example.com"}
$ rake routes EXTERNAL_HOST=foobar
Prefix Verb URI Pattern      Controller#Action
 thing GET  /thing(.:format) dev#null {:host=>"foobar"}
person max    schedule 12.10.2015

Попробуй это. Надеюсь, это сработает для вас.

MyApp::Application.routes.draw do
  # External urls
  scope host: 'www.example.com' do
    get 'thing' => 'dev#null', as: :thing
  end
end

# Use thing_url in your veiws (thing_path would not include the host)
# thing_url => "http://www.example.com/thing"
person sushilprj    schedule 12.10.2015
comment
Здесь вы можете справиться с производственными/непроизводственными требованиями, вставив третичный оператор, например scope host: (Rails.env.production? ? 'www.example.com' : 'example-test.com') do - person Max Williams; 12.10.2015
comment
Хорошая идея @MaxWilliams, но я бы использовал переменную конфигурации: scope host: Rails.configuration.external_host. Затем вы можете установить различные значения в /config/development.rb, /config/production.rb ... - person max; 12.10.2015
comment
Это будет настраиваемый параметр конфигурации. Смотрите мой ответ. - person max; 12.10.2015
comment
Спасибо @max. Я только что увидел это всплывающее окно и удалил свой комментарий. Это отлично отвечает на мой вопрос. - person Elvn; 12.10.2015
comment
Да, это чище, чем встроенный третичный оператор. - person Max Williams; 12.10.2015