Отсутствует хост для ссылки на! Пожалуйста, предоставьте: параметр хоста или установите 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 для почтовой программы действий для каждой среды, такой как разработка, тестирование, постановка и производство и т. Д.
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.