Brak hosta do linku! Podaj: parametr hosta lub ustaw opcje default_url_options [: host]

183

Pracuję w Google od około 90 minut i wciąż nie mam na to odpowiedzi. Gdzie mam ustawić default_url_options? Ustawiłem już tę opcję, config.action_mailer.default_url_optionsaby rozwiązać ten sam błąd w innym miejscu, ale teraz pojawia się ten błąd, gdy próbuję użyć pomocnika adresu URL w specyfikacji RSpec. Nie mam pojęcia, gdzie oczekuje się ustawienia opcji 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)>'

Ten kod nie ma nic wspólnego z wiadomościami e-mail / ActionMailer, po prostu potrzebuje adresu URL zamiast ścieżki.

Jakieś pomysły?

d11wtq
źródło
Czym w ogóle jest gospodarz?
Jwan622,

Odpowiedzi:

260

Musisz dodać następujący wiersz w każdym środowisku:

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

W ten sposób może działać we wszystkich środowiskach i może różnić się w zależności od środowiska. Na przykład:

development.rb

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

test.rb

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

produkcja.rb

config.action_mailer.default_url_options = { :host => "www.yourhost.com" }
Carlos Castillo
źródło
16
Upewnij się także, że po dodaniu tego zrestartujesz serwer Railsowy. Pliki w konfiguracji / nie są ponownie ładowane automatycznie.
Stenerson
3
Zrobiłem bardzo podobny do tego i ustawienie default_url_option dla action_mailer nie pomoże. Przypadek użycia jest podobny do tego: Rails.application.routes.url_helpers.message_image_url (2)
Boti
1
Zrobił to; Z lub bez www ... prefiks nazwy hosta w produkcji, nadal pojawia się ten sam błąd. Dodano trasę na @ d11wtq i działało. Czy jest jakaś zmiana w Rails4, która spowodowała takie zachowanie? Odtąd nigdy nie widziałem go przed aktualizacją i tylko w jednym konkretnym e-mailu (urządzenie zautomatyzowane).
JosephK
Potwierdzam, że to nie działa w moich projektach Rails 4. Ustawienie go na trasach po prostu nie ma opcji.
bnn
4
Nie działa w Rails 5. Dodane default_url_options Rails.application.config.action_mailer.default_url_optionsi to
załatwiło sprawę
74
Your::Application.routes.draw do
  default_url_options :host => "example.com"

  # ... snip ...
end

Gdzieś w routes.rb:)

d11wtq
źródło
35
Niezbyt dobrze, jeśli masz wiele różnych środowisk o różnych adresach URL
Neil Middleton,
2
Tak, co robisz, jeśli masz wiele domen env?
wejrowski
Przypuszczalnie po prostu podać go do każdego adresu URL, zamiast, albo w trasy, czy w adresie pomocniczym inwokacji: listing_url(listing, :host => "whatever.com").
d11wtq
14
W pliku konfiguracyjnym dla każdego odpowiedniego środowiska dodaję tę niestandardową opcję: config.domain = 'staging.myapp.com'(oczywiście zastępuję poprawną nazwę domeny dla każdej env). Wówczas routes.rbjestem darmowy default_url_options host: Rails.application.config.domaini będzie działać w każdym środowisku. Nie ma za co.
Prathan Thananart
10
Lepszym rozwiązaniem byłoby, w pliku trasy, to zrobić: default_url_options Rails.application.config.action_mailer.default_url_options.
siannopollo
42

Host powinien zostać określony w pliku konfiguracyjnym każdego środowiska. Na przykład:

config/environments/development.rb

Zobacz to pytanie i to pytanie .

nickh
źródło
4
Dzięki, IMHO to lepsza odpowiedź niż odpowiedź, która używa trasy.draw
joelparkerhenderson
1
Ta odpowiedź nie pomaga w przypadku korzystania z różnych domen i rozwiązuje inne problemy.
Ryan
1
@ Ryan możesz po prostu użyć zmiennych środowiskowych, aby to naprawić
courtimas
35

Ustaw default_url_optionsAby użyć action_mailer.default_url_options.

W każdym z plikami środowiska (np development.rb, production.rbetc.) można określić default_url_optionsużyć do action_mailer:

config.action_mailer.default_url_options = { host: 'lvh.me', port: '3000' }

Nie są one jednak ustawione dla MyApp:Application.default_url_options:

$ MyApp::Application.config.action_mailer.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}

$ MyApp::Application.default_url_options
#=> {}

Dlatego ten błąd pojawia się w czymkolwiek poza ActionMailer.

Można ustawić aplikacji default_url_optionsdo korzystania co określono dla action_mailerw odpowiednim pliku środowiska ( development.rb, production.rb, itd.).

Aby zachować SUCHOŚĆ, jak to możliwe, zrób to w swoim config/environment.rbpliku, więc musisz to zrobić tylko raz:

# 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

Teraz, gdy uruchomisz aplikację, całe aplikacje default_url_optionsbędą pasować do 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"}

Czapka dla @pduersteler za prowadzenie mnie tą ścieżką.

Joshua Pinter
źródło
2
Konfiguracja zgodnie z config/environment.rbopisem była kluczem do uruchomienia mojego programu pocztowego w konsoli. Dziękuję Ci!
Eric D. Fields
@ EricD.Fields Nie ma za co, Eric! Uważam to za tak użyteczne, że myślę, że powinno być wbudowane w rdzeń Railsów.
Joshua Pinter
Tak byłoby w Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_optionsprzypadku Railsów 5.2+
Sandro L
Dzięki, @SandroL! Nadal korzystamy z Rails 4.2, więc nie testowaliśmy jeszcze w późniejszych wersjach.
Joshua Pinter,
Kilka osób to poleca. Wydaje mi się, że ludzie po prostu skonfigurowali opcję action_mailer.default_url_options ze względów historycznych, ale czy nie jest bardziej logiczne ustawienie tej opcji na podstawie application.default_url_options niż na odwrót? Po co angażować fałszywe odniesienie do mailera podczas konfigurowania działania linków do Twojej witryny?
Harry Wood,
24

Gdy użyjesz dowolnej listing_urlmetody, zostanie zwrócony pełny adres URL (normalnie nie względny). Właśnie dlatego szyny proszą cię o hosta, aby obliczyć cały adres URL.

Jak rozpoznać szynę hosta? Możesz to zrobić na kilka sposobów:

1.Dodanie tej opcji do każdego środowiska:

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

UWAGA: Jeśli pracujesz w silniku szynowym, pamiętaj, aby zrobić to samo dla aplikacji-manekina w ramach testów silnika: path_to_your_engine/test/dummy/config/environments/*ponieważ podczas testowania silnika testowane są szyny.

2. Dodaj opcję hosta do metody foo_url w następujący sposób:

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

3.Nie wysyłaj hosta z opcją:only_path to true .

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

IMHO Nie widzę sensu w tym, ponieważ w tym przypadku użyłbym listing_pathmetody

ivanxuu
źródło
Krok 1 zawsze działa dla mnie i dziś, używając klejnotu rafinerii cms, wystarczy krok 2 uratować mnie. Dziękuję za komentarz.
lucianosousa
15

Zabawne, że to ustawienie config.action_mailer.default_url_optionsmi nie pomaga. Poza tym bawienie się ustawieniami niezależnymi od środowiska w miejscach, w których czułem, że nie należy, nie było dla mnie satysfakcjonujące. Dodatkowo chciałem rozwiązania, które zadziała podczas generowania adresów URL w pracownikach sidekiq / resque.

Moje dotychczasowe podejście, które dotyczy 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

Działa to dla mnie w szynach> = 3.2.x.

pduersteler
źródło
1
To i tylko to działało, aby mailer zawierał adres URL, ale psuje inne funkcje link_to w mojej aplikacji.
1
Świetne myślenie, @pduesteler! Właściwie poszedłem o krok dalej i byłem w stanie dodać tylko jeden wiersz w config/environment.rbpliku, aby to zrobić. I dodałem szczegółową odpowiedź: stackoverflow.com/a/48529627/293280 Dzięki za skierowanie mnie w tym kierunku.
Joshua Pinter
9

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

W developemnt.rb / test.rb może być bardziej zwięzłe, jak następuje:

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

  routes.default_url_options[:host] = 'localhost:3000'
end
Derek Fan
źródło
7

Zawsze możesz przekazać hosta jako parametr do pomocnika adresu URL:

listing_url(listing, host: request.host)
Brak uwagi
źródło
Uwaga: Możesz także dodać portlisting_url(listing, host: request.host, port: 3000)
drhenner
Ale co, jeśli nie masz kontekstu żądania? Jak w większości rzeczy innych niż kontroler?
courtimas
1

Miałem ten sam błąd. Wszystko napisałem poprawnie, w tym Listing 10.13 z samouczka.

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

oczywiście z „example.com” zastąpiony moim adresem URL serwera.

W samouczku opisałem to w następujący sposób:

Po zrestartowaniu serwera programistycznego w celu aktywacji konfiguracji ...

Więc dla mnie odpowiedzią było wyłączenie i ponowne włączenie serwera.

Okomikeruko
źródło
1

przejdź do config / environment / test.rb

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

milad rahmani
źródło
2
Odpowiedź wymaga więcej informacji. Opisz, co naprawdę proponujesz jako rozwiązanie.
Levi Roberts,
1
Oto kilka przydatnych wskazówek, jak odpowiedzieć . Uważam, że warto się do nich odwoływać.
Garrett Motzner,
1

na wypadek, gdyby ktoś znalazł to wyszukiwanie błędów związanych z ActiveStorage:

jeśli masz działanie kontrolera, w którym chcesz wygenerować adresy URL do wysyłania itp. za pomocą lokalnej usługi dyskowej (najprawdopodobniej w środowisku testowym), musisz to zrobić include ActiveStorage::SetCurrentw kontrolerze, aby umożliwić blob.service_url_for_direct_uploadpoprawne działanie.

phoet
źródło
Dziękuję Ci! Używając tego poza kontrolerem (bezpośrednia mutacja GraphQL) musiałem go trochę ulepszyć, ale działa. Szukałem tego, jeszcze raz dziękuję @ phoet :)
Stan
0

Dodanie default_url w trasach nie jest właściwym rozwiązaniem, chociaż działa w niektórych przypadkach.

Musisz ustawić default_url w każdym środowisku (programowanie, testowanie, produkcja).

Musisz wprowadzić te zmiany.

    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'
Prabhakar Undurthi
źródło
0

Rozwiązałem problem, konfigurując environment.rb jako

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

Musisz ustawić default_url_options dla mailera akcji dla każdego środowiska, takiego jak programowanie, testowanie, przemieszczanie i produkcja itp.

Odniesienie: brak hosta do linku! Podaj: parametr hosta lub ustaw opcje default_url_options [: host]

zeeshan
źródło
0

Powyższa odpowiedź nie działała dla mnie, a przynajmniej nie tak, jak chciałem. Uświadomiłem sobie config.action_mailer.default_url_options = { host: "localhost", port: 3000 } po zainstalowaniu urządzenia. Mam nadzieję, że pomoże to komuś z tym samym problemem.

Ahmed J.
źródło