Как установить сервер по умолчанию для помощников URL-адресов в рельсах?
Я хотел бы сделать что-то вроде этого
config.default_host = 'www.subdomain.example.com'
в некоторых моих конфигурационных файлах, так что object_url
helpers (ActionView::Helpers::UrlHelper
) создают ссылки, начинающиеся с http://www.subdomain.example.com
Я попытался выполнить поиск документов, но я ничего не нашел, кроме ActionMailer
docs и http://api.rubyonrails.org/classes/Rails/Configuration.html, что для меня не полезно, потому что я не знаю, в какой похлопывании посмотреть. Есть ли место, которое описывает всю структуру Rails:: Initializer.config?
Ответы
Ответ 1
asset_host
не работает для URL-адресов
Вам нужно переопределить default_url_options
в ApplicationController
(по крайней мере, в Rails 3)
http://edgeguides.rubyonrails.org/action_controller_overview.html#default-url-options
class ApplicationController < ActionController::Base
def default_url_options
if Rails.env.production?
{:host => "myproduction.com"}
else
{}
end
end
end
Ответ 2
Определите хост по умолчанию в конфигурации вашей среды:
# config/environments/staging.rb
MyApp::Application.configure do
# ...
Rails.application.routes.default_url_options[:host] = 'preview.mydomain.com'
# ...
end
Затем вы можете создать URL-адрес в любом месте приложения:
Rails.application.routes.url_helpers.widgets_url()
Или включите URL-адреса в свой класс:
class MyLib
include Rails.application.routes.url_helpers
def make_a_url
widgets_url
end
end
Если вы не определяете хост по умолчанию, вам необходимо передать его в качестве опции:
widgets_url host: (Rails.env.staging? ? 'preview.mydomain.com' : 'www.mydomain.com')
Также полезно указывать такие вещи, как протокол:
widgets_url protocol: 'https'
Ответ 3
Другой способ - установить его таким образом
# config/production.rb
config.action_controller.default_url_options = { host: 'myproduction.com' }
Ответ 4
Вы можете легко установить параметр :host
или/и :only_path
для каждого url_helper.
yours_url(params, :host => "http://example.com", :only_path => Rails.env.test?)
Таким образом, вы не устанавливаете глобальные параметры default_url_options в своих средах, если вы этого не хотите.
Ответ 5
Насколько я знаю, помощники *_url
используют настроенное имя сервера. Например, если моя установка Apache принимает запросы для этого приложения Rails в http://www.myapp.com/
, тогда Rails будет использовать этот адрес. Поэтому методы *_url
в среде разработки указывают на http://localhost:3000
по умолчанию.
Хост-ресурс, предложенный в предыдущем ответе, будет влиять только на помощники image_tag
, stylesheet_link_tag
и javascript_link_tag
.
Ответ 6
Самый простой способ получить динамический доменный URL с использованием глобальной переменной в рельсах.
class ApplicationController < ActionController::Base
def base_url
$base_url = request.base_url
end
end
После того, как вы просто вызвали этот метод в свой файл заголовка <% base_url %>
, теперь вы можете получить доступ к своему URL-адресу домена в любом месте приложения.
Ответ 7
Решение NSD - это то, как я это делаю, но мне пришлось добавить блок, чтобы он работал с https:
config.action_controller.asset_host = Proc.new { |source, request|
(request ? request.protocol : 'http://') + "www.subdomain.example.com"
}
Ответ 8
Вот это, но я не уверен, что они помощники, о которых вы говорите:
ActionController::Base.asset_host = "assets.example.com"
http://api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html