it-roy-ru.com

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

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

Есть идеи?

162
d11wtq
Your::Application.routes.draw do
  default_url_options :Host => "example.com"

  # ... snip ...
end

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

63
d11wtq

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

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" }
237
Carlos Castillo

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

config/environments/development.rb

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

38
nickh

При использовании любого метода listing_url будет возвращен полный URL-адрес (не относительный, как обычно). Вот почему Rails запрашивает у вас хост для вычисления всего URL.

Как вы можете сказать Rails хост? Вы можете сделать это несколькими способами:

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

ПРИМЕЧАНИЕ: Если вы работаете внутри движка Rails , не забудьте сделать то же самое для вашего фиктивного приложения в тестах движка: path_to_your_engine/test/dummy/config/environments/* потому что когда вы тестируете движок, это то, с чем Rails тестирует.

2. Добавьте опцию Host к методу foo_url следующим образом:

listing_url(listing, Host: request.Host) # => 'http://localhost:3000/listings/1'

.Не выводить хост с параметром :only_path to true.

listing_url(listing, only_path: true ) # => '/listings/1'   

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

24
ivanxuu

Установите 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 и т.д.).

Чтобы сохранить все как можно более DRY, сделайте это в своем файле 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 для того, чтобы вести меня по этому пути.

22
Joshua Pinter

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

14
pduersteler

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

listing_url(listing, Host: request.Host)
6
Undistraction

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

В файле development.tb/test.rb можно быть более кратким:

Rails.application.configure do
  # ... other config ...

  routes.default_url_options[:Host] = 'localhost:3000'
end
3
Derek Fan

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

3
RicRoberts

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

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

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

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

1
Okomikeruko

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

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

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

0
milad rahmani