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

183

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

Любые идеи?

d11wtq
источник
Что такое хозяин в любом случае?
Jwan622

Ответы:

260

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

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" }
Карлос Кастильо
источник
16
Также убедитесь, что вы перезапустите свой сервер rails после добавления этого. Файлы в config / не загружаются автоматически.
Стенерсон
3
Я сделал очень похоже на это, и установка default_url_option для action_mailer не поможет. Вариант использования аналогичен следующему: Rails.application.routes.url_helpers.message_image_url (2)
Боти
1
Сделал это; с или без www ... с префиксом имени хоста в производственной среде, я все еще получаю ту же ошибку. Добавил маршрут за @ d11wtq, и все заработало. Есть ли изменения в Rails4, которые вызвали такое поведение? Я никогда не видел его до обновления, и только в одной конкретной почте (devise-автоматизирован), так как.
JosephK
Могу подтвердить, что это не работает в моих проектах Rails 4. Установка его в маршрутах просто не вариант.
2015 года
4
Не работает в Rails 5. default_url_options Rails.application.config.action_mailer.default_url_optionsХотя добавлено, и это
помогло
74
Your::Application.routes.draw do
  default_url_options :host => "example.com"

  # ... snip ...
end

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

d11wtq
источник
35
Не очень хорошо, если у вас много разных сред с разными URL-адресами
Нил Миддлтон
2
Да, что вы делаете, если у вас есть несколько доменов env?
Вейровский
Предположительно вы просто указать его для каждого URL вместо, либо в карте маршрута, или в URL - адрес хелперов вызова: listing_url(listing, :host => "whatever.com").
d11wtq
14
В файле конфигурации для каждой соответствующей среды я добавляю эту настраиваемую опцию: config.domain = 'staging.myapp.com'(конечно, подставьте правильное имя домена для каждого env). Тогда routes.rbя могу свободно использовать default_url_options host: Rails.application.config.domainего, и он будет работать в любой среде. Пожалуйста.
Пратан Тананарт
10
Лучше было бы, в файле маршрутов, сделайте следующее: default_url_options Rails.application.config.action_mailer.default_url_options.
siannopollo
42

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

config/environments/development.rb

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

nickh
источник
4
Спасибо, ИМХО, это лучший ответ, чем ответ, который использует rout.draw
joelparkerhenderson
1
Этот ответ не помогает при использовании разных доменов и решает другие проблемы.
Райан
1
@ Райан, вы можете просто использовать переменные окружения, чтобы это исправить
courtimas
35

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

Джошуа Пинтер
источник
2
Настройка, config/environment.rbкак вы описали, была ключом к тому, чтобы заставить мою почтовую программу работать в консоли. Спасибо!
Эрик Д. Филдс,
@ EricD.Fields Добро пожаловать, Эрик! Я нахожу это настолько полезным, что думаю, что оно должно быть встроено в ядро ​​Rails.
Джошуа Пинтер
Это было бы Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_optionsдля Rails 5.2+
Sandro L
Спасибо, @SandroL! Мы все еще на Rails 4.2, поэтому еще не тестировали более поздние версии.
Джошуа Пинтер
Несколько человек рекомендуют это. Я предполагаю, что просто люди имеют тенденцию к тому, что action_mailer.default_url_options уже настроены по историческим причинам, но не логичнее ли устанавливать это на основе application.default_url_options, а не наоборот? Зачем использовать фиктивную ссылку на почтовую рассылку при настройке работы ссылок вашего сайта?
Гарри Вуд
24

При использовании любого 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метод

ivanxuu
источник
Шаг 1 всегда работает для меня, и сегодня, используя драгоценный камень refinery-cms, шаг 2 спаси меня. Спасибо за комментарий.
lucianosousa
15

Самое смешное, что настройка 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.

pduersteler
источник
1
Это и только это сработало для того, чтобы заставить почтовую программу включить URL, но это нарушает другие функции link_to в моем приложении.
1
Отличное мышление, @pduesteler! Я на самом деле сделал еще один шаг вперед и смог добавить для этого всего одну строку в config/environment.rbфайле. И добавил ответ, который подробно описан : stackoverflow.com/a/48529627/293280 Спасибо, что указали мне в этом направлении.
Джошуа Пинтер
9

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
Дерек Фан
источник
7

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

listing_url(listing, host: request.host)
Undistraction
источник
Примечание: вы также можете добавить портlisting_url(listing, host: request.host, port: 3000)
drhenner
Но что, если у вас нет контекста запроса? Как в большинстве вещей, кроме контроллера?
Courtimas
3

Вы можете установить параметры 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

RicRoberts
источник
Это хорошее решение для Rails 4, поскольку оно позволяет вам при необходимости устанавливать параметры, специфичные для контроллера.
Ибрагим
1

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

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

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

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

Okomikeruko
источник
1

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

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

Милад Рахмани
источник
2
Ответ требует больше информации. Пожалуйста, опишите, что именно вы предлагаете в качестве решения.
Леви Робертс
1
Вот несколько полезных советов о том, как ответить . Я считаю их полезными для ссылки.
Гаррет Моцнер
1

на тот случай, если кто-то найдет этот поиск ошибок ActiveStorage:

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

phoet
источник
Спасибо! Использование этого вне контроллера (мутация прямой загрузки GraphQL), так что пришлось немного подправить, но работает. Я искал это, еще раз спасибо @phoet :)
Стэн
0

Добавление 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'
Прабхакар Ундурти
источник
0

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

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

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

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

Zeeshan
источник
0

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

Ахмед Дж.
источник