Отсутствует хост для ссылки на! Пожалуйста, укажите: параметр хоста или установите default_url_options [: хост] - PullRequest
163 голосов
/ 28 августа 2011

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

Есть идеи?

Ответы [ 12 ]

237 голосов
/ 01 ноября 2012

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

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" }
63 голосов
/ 28 августа 2011
Your::Application.routes.draw do
  default_url_options :host => "example.com"

  # ... snip ...
end

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

38 голосов
/ 05 марта 2012

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

config/environments/development.rb

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

24 голосов
/ 22 августа 2014

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

23 голосов
/ 30 января 2018

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

14 голосов
/ 11 мая 2013

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

6 голосов
/ 14 ноября 2013

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

listing_url(listing, host: request.host)
4 голосов
/ 16 января 2019

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
3 голосов
/ 19 июня 2012

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

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

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

1 голос
/ 25 февраля 2019

Зайдите в config / environment / test.rb

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

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