Отсутствует хост для ссылки! Укажите параметр хоста или установите default_url_options [: host]

Я уже почти 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 вместо пути.

Любые идеи?

Ответ 1

Your::Application.routes.draw do
  default_url_options :host => "example.com"

  # ... snip ...
end

Где-то в routes.rb :)

Ответ 2

Вам нужно добавить следующую строку в каждой среде:

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" }

Ответ 3

Хост должен быть указан в каждом файле конфигурации среды. Например:

config/environments/development.rb

Смотрите этот вопрос и этот вопрос.

Ответ 4

Когда вы используете какой-либо метод 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

Ответ 5

Установите 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 для того, чтобы вести меня по этому пути.

Ответ 6

Забавно, что настройка 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.

Ответ 7

Вы всегда можете передать хост в качестве параметра для хелпера URL:

listing_url(listing, host: request.host)

Ответ 9

У меня была такая же ошибка. У меня было все правильно написанное, включая листинг 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-адресом сервера.

То, что я прояснил в учебнике, это строка:

После перезапуска сервера разработки, чтобы активировать конфигурацию...

Таким образом, ответ для меня состоял в том, чтобы выключить сервер и снова включить его.

Ответ 10

Добавление параметра 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'

Ответ 11

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