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

Я гуглял уже около 90 минут и до сих пор не могу ответить на этот вопрос. Где я могу установить 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 вместо пути.

Есть идеи?

17 ответов

Решение
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

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

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

Когда вы используете любой listing_url Метод будет возвращен полный URL (не относительный, как обычно). Вот почему rails запрашивает у вас хост, чтобы вычислить весь 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. Добавьте опцию host к методу 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'   

ИМХО, я не вижу смысла в этом, потому что в этом случае я бы использовал listing_path метод

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

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

Это работает для меня в рельсах>= 3.2.x.

Приведенный выше ответ не сработал для меня, по крайней мере, не так, как я хотел. я осознал config.action_mailer.default_url_options = { host: "localhost", port: 3000 }после установки devise. Надеюсь, это поможет кому-то с той же проблемой.

Вы всегда можете передать host в качестве параметра помощнику URL:

listing_url(listing, host: request.host)

Перейдите в config/environment / test.rb

Rails.application.routes.default_url_options [: host] = 'localhost: 3000'

На всякий случай кто-то найдет этот поиск ошибок, касающихся ActiveStorage:

если у вас есть действие контроллера, в котором вы хотите сгенерировать URL-адреса для загрузки и т.д. с помощью локальной дисковой службы (скорее всего, в тестовой среде), вам необходимо include ActiveStorage::SetCurrent в контроллере, чтобы позволить blob.service_url_for_direct_upload чтобы работать правильно.

Вы можете установить параметры URL по умолчанию в Application Controller:

class ApplicationController < ActionController::Base
  def default_url_options
    {:locale => I18n.locale}
  end
end

http://guides.rubyonrails.org/action_controller_overview.html

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

То, что я затушевал в уроке, было этой строкой:

После перезапуска сервера разработки для активации конфигурации...

Поэтому для меня ответом было выключить и снова включить сервер.

Я решил проблему, настроив environment.rb как

YourApp::Application.default_url_options = YourApp::Application.config.action_mailer.default_url_options

Вам необходимо установить default_url_options для почтовой программы действий для каждой среды, такой как разработка, тестирование, постановка и производство и т. Д.

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

Rails.application.config.action_mailer.default_url_options

      config.action_mailer.default_url_options = { host: 'my.domain', protocol: 'https', port: 356 }

Rails.application.default_url_options

      self.default_url_options = config.action_mailer.default_url_options

Сначала настройте параметры URL-адреса по умолчанию Action Mailer (как в большинстве ответов)

И после этого назначьте эти параметры приложению. Первоначальный вопрос именно об этом конфиге! Не про почтовик :) Странно, вопрос старый, но не все ответы настраивают этот конфиг и не упоминают простыеselfназначение

Поместите такие строки вconfig/application.rbили в конкретную среду, например вconfig/environments/development.rb

После этого вы можете получить доступ к таким помощникам маршрутов

      Rails.application.routes.url_helpers.user_url(25)
# => "https://my.domain:356/users/25"

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

Не хотел менять поведение для других сред, поэтому использовал:

development.rb

      Rails.application.configure do
...
end

Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_options

Работает в Rails 6.

Другие вопросы по тегам