Ответ 1
Your::Application.routes.draw do
default_url_options :host => "example.com"
# ... snip ...
end
Где-то в routes.rb
:)
Я уже почти 90 минут прорабатываю поиски в Google и до сих пор не отвечаю на это. Где установить default_url_options
? Я уже установил его для config.action_mailer.default_url_options
для решения этой же проблемы в другом месте, но теперь я получаю эту ошибку при попытке использовать вспомогательный URL-адрес внутри спецификации RSpec. Я не знаю, где он ожидает установки default_url_options.
Failure/Error: listing_url(listing).should match(/\/\d+-\w+$/)
RuntimeError:
Missing host to link to! Please provide :host parameter or set default_url_options[:host]
# ./spec/routing/listing_routing_spec.rb:9:in `block (3 levels) in <top (required)>'
Этот код не имеет ничего общего с электронными сообщениями /ActionMailer, ему просто нужен URL вместо пути.
Любые идеи?
Your::Application.routes.draw do
default_url_options :host => "example.com"
# ... snip ...
end
Где-то в routes.rb
:)
Вам нужно добавить следующую строку в каждой среде:
config.action_mailer.default_url_options = { :host => "yourhost" }
Таким образом, он может работать во всех средах и может отличаться от среды для среды. Например:
development.rb
config.action_mailer.default_url_options = { :host => "dev.yourhost.com" }
test.rb
config.action_mailer.default_url_options = { :host => "test.yourhost.com" }
production.rb
config.action_mailer.default_url_options = { :host => "www.yourhost.com" }
Хост должен быть указан в каждом файле конфигурации среды. Например:
config/environments/development.rb
Смотрите этот вопрос и этот вопрос.
Когда вы используете какой-либо метод listing_url
, будет возвращен полный URL (не относительный, как обычно). Вот почему рельсы запрашивают у вас хост, чтобы вычислить весь URL.
Как вы можете определить рельсы хоста? Вы можете сделать это несколькими способами:
1. Добавление этой опции в каждую среду:
[/config/development.rb]
config.action_mailer.default_url_options = { host: "localhost:3000" }
[/config/test.rb]
config.action_mailer.default_url_options = { host: "localhost:3000" }
[/config/production.rb]
config.action_mailer.default_url_options = { host: "www.example.com" }
ПРИМЕЧАНИЕ.. Если вы работаете внутри движка рельсов, не забудьте сделать то же самое для своего фиктивного приложения внутри тестов двигателя: path_to_your_engine/test/dummy/config/environments/*
, потому что, когда вы тестируете двигатель, с которым тестируются рельсы.
2. Добавьте параметр хоста к методу foo_url следующим образом:
listing_url(listing, host: request.host) # => 'http://localhost:3000/listings/1'
3.Не выводите хост с опцией :only_path to true
.
listing_url(listing, only_path: true ) # => '/listings/1'
IMHO Я не вижу смысла в этом, потому что в этом случае я бы использовал метод listing_path
default_url_options
, чтобы использовать action_mailer.default_url_options
.В каждом из файлов среды (например, development.rb
, production.rb
и т.д.) вы можете указать default_url_options
для action_mailer
:
config.action_mailer.default_url_options = { host: 'lvh.me', port: '3000' }
Однако они не установлены для MyApp:Application.default_url_options
:
$ MyApp::Application.config.action_mailer.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}
$ MyApp::Application.default_url_options
#=> {}
Вот почему вы получаете эту ошибку в чем-либо вне ActionMailer
.
Вы можете установить приложение default_url_options
для использования того, что вы определили для action_mailer
, в соответствующем файле среды (development.rb
, production.rb
и т.д.).
Чтобы все было как можно сухим, сделайте это в своем файле config/environment.rb
, поэтому вам нужно сделать это только один раз:
# Initialize the rails application
MyApp::Application.initialize!
# Set the default host and port to be the same as Action Mailer.
MyApp::Application.default_url_options = MyApp::Application.config.action_mailer.default_url_options
Теперь, когда вы загружаете свое приложение, ваше приложение default_url_options
будет соответствовать вашему action_mailer.default_url_options
:
$ MyApp::Application.config.action_mailer.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}
$ MyApp::Application.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}
подсказка для шляпы @pduersteler для того, чтобы вести меня по этому пути.
Забавно, что настройка config.action_mailer.default_url_options
не помогает мне. Кроме того, возиться с не зависящими от окружающей среды настройками в тех местах, где я чувствовал, что это не относится, не было для меня удовлетворительным. Кроме того, я хотел найти решение, которое работало при создании URL-адресов в sidekiq/resque.
Мой подход до сих пор, который идет в config/environments/{development, production}.rb
:
MyApp::Application.configure do
# Stuff omitted...
config.action_mailer.default_url_options = {
# Set things here as usual
}
end
MyApp::Application.default_url_options = MyApp::Application.config.action_mailer.default_url_options
Это работает для меня в rails >= 3.2.x.
Вы всегда можете передать хост в качестве параметра для хелпера URL:
listing_url(listing, host: request.host)
Вы можете установить параметры URL-адреса по умолчанию в Application Controller:
class ApplicationController < ActionController::Base
def default_url_options
{:locale => I18n.locale}
end
end
http://guides.rubyonrails.org/action_controller_overview.html#default_url_options
У меня была такая же ошибка. У меня было все правильно написанное, включая листинг 10.13 из учебника.
Rails.application.configure do
.
.
.
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delevery_method :test
host = 'example.com'
config.action_mailer.default_url_options = { host: host }
.
.
.
end
очевидно, с "example.com" заменен моим URL-адресом сервера.
То, что я прояснил в учебнике, это строка:
После перезапуска сервера разработки, чтобы активировать конфигурацию...
Таким образом, ответ для меня состоял в том, чтобы выключить сервер и снова включить его.
Добавление параметра default_url в маршрутах не является правильным решением, хотя оно работает в некоторых случаях.
Вы должны установить default_url в каждой среде (разработка, тестирование, производство).
Вам нужно внести эти изменения.
config/environments/development.rb
config.action_mailer.default_url_options =
{ :host => 'your-host-name' } #if it is local then 'localhost:3000'
config/environments/test.rb
config.action_mailer.default_url_options =
{ :host => 'your-host-name' } #if it is local then 'localhost:3000'
config/environments/development.rb
config.action_mailer.default_url_options =
{ :host => 'your-host-name' } #if it is local then 'localhost:3000'
Rails.application.routes.default_url_options[:host]= 'localhost:3000'
В developmnt.rb/test.rb, может быть более кратким, как показано ниже:
Rails.application.configure do
# ... other config ...
routes.default_url_options[:host] = 'localhost:3000'
end