Відсутній хост для посилання на! Укажіть: параметр хоста або встановіть 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-адреса замість шляху.

Будь-які ідеї?


Який господар все-таки?
Jwan622

Відповіді:


260

Вам потрібно додати наступний рядок у кожному середовищі:

config.action_mailer.default_url_options = { :host => "yourhost" }

Таким чином, він може працювати в будь-яких умовах і може відрізнятися від середовища до середовища. Наприклад:

розвиток.rb

config.action_mailer.default_url_options = { :host => "dev.yourhost.com" }

test.rb

config.action_mailer.default_url_options = { :host => "test.yourhost.com" }

виробництво.rb

config.action_mailer.default_url_options = { :host => "www.yourhost.com" }

16
Також переконайтесь, що після перезавантаження перезавантажте сервер рейкових систем. Файли під конфігурацією / не завантажуються автоматично.
Stenerson

3
Я зробив дуже подібне до цього, і встановлення default_url_option для action_mailer не допоможе. Випадок використання схожий на такий: Rails.application.routes.url_helpers.message_image_url (2)
Boti

1
Зробив це; з або без www ... з префіксацією імені хоста у виробництві, я все-таки отримав ту саму помилку. Додано маршрут per @ d11wtq, і він спрацював. Чи є якась зміна Rails4, яка спричинила таку поведінку? Я ніколи не бачив його перед оновленням, і лише в одному конкретному поштовому відправці (розробці автоматизовано), оскільки
ДжозефК

Можу підтвердити, що це не працює в моїх проектах Rails 4. Встановити його на маршрутах просто не є варіантом.
b1nary

4
Не працює в Rails 5. Додано, default_url_options Rails.application.config.action_mailer.default_url_optionsале це зробило трюк, як запропонував інший коментатор
BooBailey

74
Your::Application.routes.draw do
  default_url_options :host => "example.com"

  # ... snip ...
end

Десь у routes.rb:)


35
Не дуже добре, якщо у вас є багато різних середовищ з різними URL-адресами
Ніл Міддлтон,

2
Так, що робити, якщо у вас є кілька областей env?
wejrowski

Імовірно ви просто вказати його для кожного 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

Дивіться це питання і це питання .


4
Дякую, ІМХО - це краща відповідь, ніж відповідь, яка використовує route.draw
joelparkerhenderson

1
Ця відповідь не допомагає при використанні різних доменів та вирішує інші проблеми.
Райан

1
@Ryan ви можете просто використовувати середовище vars, щоб виправити це
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-адреса (не відносна як звичайна). Ось чому рейли просять вас хоста, щоб обчислити всю 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'   

IMHO Я не бачу сенсу в цьому, оскільки в цьому випадку я використовував би listing_pathметод


Крок 1 завжди працює для мене, і сьогодні, використовуючи дорогоцінний камінь 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.


1
Це і лише це працювало для того, щоб поштовий розробник включив URL-адресу, але це порушує інші функції link_to в моєму додатку.

1
Чудове мислення, @pduesteler! Я фактично зробив цей крок далі і зміг додати лише один рядок у config/environment.rbфайл, щоб зробити це. І додав відповідь, що йде до деталей: stackoverflow.com/a/48529627/293280 Дякую, що вказали мені в цьому напрямку.
Джошуа Пінтер

9

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

У developemnt.rb / test.rb можна бути більш коротким:

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

  routes.default_url_options[:host] = 'localhost:3000'
end

7

Ви завжди можете передавати хост як параметр до помічника URL-адреси:

listing_url(listing, host: request.host)

Примітка: Ви можете також додати портlisting_url(listing, host: request.host, port: 3000)
drhenner

Але що робити, якщо у вас немає контексту запиту? Як і в більшості речей, окрім контролера?
Courtimas

3

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


Це хороше рішення для 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-адресу сервера.

Що я змалював у підручнику, це такий рядок:

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

Тож відповідь для мене полягала в тому, щоб вимкнути та знову ввімкнути сервер.


1

перейдіть до конфігурації / середовища / 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нормально працювати.


Дякую! Використовуючи це за межами контролера (мутація прямого завантаження 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 [: хост]


0

Наведена відповідь не спрацювала для мене, принаймні не так, як я хотів. Я зрозумів config.action_mailer.default_url_options = { host: "localhost", port: 3000 } після установки приладу. Сподіваюся, це допоможе комусь із тією ж проблемою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.