Bağlantı kurulacak ana makine eksik! Lütfen sağlayın: host parametresi veya set default_url_options [: host]


183

Yaklaşık 90 dakikadır googling yapıyorum ve hala bir cevabım yok. Nereye ayarlayabilirim default_url_options? Zaten config.action_mailer.default_url_optionsaynı hatayı başka bir yerde çözmek için ayarladım , ama şimdi bir RSpec spec içinde bir URL yardımcı kullanmaya çalışırken bu hatayı alıyorum. Burada varsayılan_url_options ayarlanmasını bekliyor hiçbir fikrim yok.

 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)>'

Bu kodun e-postalar / ActionMailer ile ilgisi yoktur, sadece yol yerine bir URL'ye ihtiyaç duyar.

Herhangi bir fikir?


Yine de ev sahibi nedir?
Jwan622

Yanıtlar:


260

Her ortama aşağıdaki satırı eklemeniz gerekir:

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

Bu şekilde, tüm ortamlarda çalışabilir ve ortamdan çevreye farklı olabilir. Örneğin:

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

16
Ayrıca, bunu ekledikten sonra raylar sunucunuzu yeniden başlattığınızdan emin olun. Config / altındaki dosyalar otomatik olarak yeniden yüklenmez.
Stenerson

3
Ben buna çok benzer yaptım ve action_mailer için default_url_option ayarlamak yardımcı olmaz. Kullanım durumu şuna benzer: Rails.application.routes.url_helpers.message_image_url (2)
Boti

1
Bunu yaptı; üretimde ana bilgisayar adının ön ekini içeren www ... olmadan, yine aynı hatayı aldım. @ D11wtq başına rota eklendi ve işe yaradı. Bu davranışa neden olan bazı Rails4 değişikliği var mı? Yükseltmeden önce hiç görmedim ve o zamandan beri sadece belirli bir posta gönderme (devise otomatik).
JosephK

Bunun Rails 4 projelerimde çalışmadığını doğrulayabilirim. Rotalarda ayarlamak sadece bir seçenek değildir.
b1nary

4
Rails 5 çalışmıyor. default_url_options Rails.application.config.action_mailer.default_url_optionsYine eklendi ve başka bir yorumcunun önerdiği gibi hile yaptı
BooBailey

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

  # ... snip ...
end

Bir yerlerde routes.rb:)


35
Farklı URL'lere sahip birçok farklı ortamınız varsa çok iyi değil
Neil Middleton

2
Evet, birden fazla env alanınız varsa ne yaparsınız?
wejrowski

Muhtemelen sadece rota haritası ya yerine her bir URL için belirtin veya url yardımcı çağırma: listing_url(listing, :host => "whatever.com").
d11wtq

14
İlgili her ortam için yapılandırma dosyasına bu özel seçeneği ekliyorum: config.domain = 'staging.myapp.com'(tabii ki her bir env için doğru bir etki alanı adıyla değiştirin). Sonra routes.rbkullanmakta özgürüm default_url_options host: Rails.application.config.domainve herhangi bir ortamda çalışacaktır. Rica ederim.
Prathan Thananart

10
Daha iyi bir yaklaşım yolları dosya içinde, bunu yapmak, olacaktır: default_url_options Rails.application.config.action_mailer.default_url_options.
siannopollo

42

Ana bilgisayar, her ortamın yapılandırma dosyasında belirtilmelidir. Örneğin:

config/environments/development.rb

Bkz bu soruyu ve bu soruya .


4
Teşekkürler, IMHO bu route.draw kullanan cevap daha iyi bir cevap
joelparkerhenderson

1
Bu yanıt, farklı alan adları kullanırken yardımcı olmaz ve diğer sorunları giderir.
Ryan

1
Sadece çevreyi kullanabilirsiniz @Ryan düzeltmek vars
courtsimas

35

Kullanmak default_url_optionsiçin ayarlayın action_mailer.default_url_options.

Ortam dosyalarınızın her birinde (ör development.rb. production.rb, Vb.) Aşağıdakiler default_url_optionsiçin kullanılacak seçenekleri belirleyebilirsiniz action_mailer:

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

Ancak, bunlar aşağıdakiler için ayarlanmamıştır MyApp:Application.default_url_options:

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

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

Bu yüzden bu hatayı dışarıdaki herhangi bir şeyde alıyorsunuz ActionMailer.

Eğer Başvuru olduğunu ayarlayabilirsiniz default_url_optionsiçin tanımlanmış neyi kullanmak action_maileruygun ortam dosyası (içinde development.rb, production.rbvs.).

İşleri olabildiğince KURU tutmak için bunu config/environment.rbdosyanızda yapın, böylece yalnızca bir kez yapmanız gerekir:

# 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

Şimdi uygulamanızı başlattığınızda, tüm Uygulamalarınız aşağıdakilerle default_url_optionseşleşecektir 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"}

Beni bu yolda ilerletmek için @pduersteler'e şapka ipucu .


2
Açıkladığınız config/environment.rbgibi ayarlamak, posta göndericimin konsolda çalışmasını sağlamak için anahtardı. Teşekkür ederim!
Eric D. Fields

@ EricD.Fields Çok hoş geldiniz, Eric! Bunu o kadar kullanışlı buluyorum ki, Rails çekirdeği içine yerleştirilmesi gerektiğini düşünüyorum.
Joshua Pinter

Yani olurdu Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_options5.2+ Raylar için
Sandro L

Teşekkürler @SandroL! Hala Rails 4.2'deyiz, bu nedenle daha sonraki sürümlerde henüz test edilmedi.
Joshua Pinter

Birkaç kişi bunu tavsiye. Ben insanlar zaten tarihsel nedenlerden dolayı yapılandırılmış action_mailer.default_url_options sahip olma eğilimi sadece sanırım ama sete daha mantıklı değil o application.default_url_options ziyade başka bir yol dayalı? Web sitenizin bağlantılarının nasıl çalıştığını yapılandırırken neden sahte bir postacı referansını dahil etmelisiniz?
Harry Wood

24

Herhangi bir listing_urlyöntemi kullandığınızda , tam URL döndürülür (normal olarak göreceli değil). Bu nedenle raylar, tüm URL'yi hesaplamak için ana makineden sizden bilgi ister.

Ev sahibini raylara nasıl söyleyebilirsiniz? Bunu birkaç şekilde yapabilirsiniz:

Bu seçeneği her ortama eklemek:

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

NOT: Bir ray motoru içinde çalışıyorsanız , motor testleri içindeki kukla uygulamanız için de aynısını yapmayı unutmayın: path_to_your_engine/test/dummy/config/environments/*çünkü motoru test ettiğinizde rayların test ettiği şey budur.

2. host seçeneğini şu şekilde foo_url yöntemine ekleyin:

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

3. seçeneği ile ana bilgisayar çıktı değil:only_path to true .

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

IMHO Bu konuda bir şey görmüyorum çünkü bu durumda listing_pathyöntemi kullanacağım


Adım 1 her zaman benim için ve bugün, rafineri-cms gem kullanarak sadece adım 2 beni kurtarmak için çalışır. Yorum için teşekkürler.
lucianosousa

15

Komik bir şey, bu ayar config.action_mailer.default_url_optionsbana yardımcı olmuyor. Ayrıca, ait olmadığını hissettiğim yerlerde çevreden bağımsız ortamlarla uğraşmak benim için tatmin edici değildi. Ayrıca, sidekiq / resque çalışanlarında url üretirken çalışan bir çözüm istedim.

Şimdiye kadar benim yaklaşımım 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

Bu benim için raylarda çalışır> = 3.2.x.


1
Bu ve yalnızca bu, postanın URL'yi eklemesini sağlamak için çalıştı, ancak uygulamamdaki diğer link_to işlevlerini bozuyor.

1
Harika düşünme, @pduesteler! Aslında bunu bir adım daha ileri götürdüm ve config/environment.rbbunu yapmak için dosyaya sadece bir satır ekleyebildim . Ve ayrıntılara giren cevap eklendi: stackoverflow.com/a/48529627/293280 Beni bu yöne yönlendirdiğiniz için teşekkürler.
Joshua Pinter

9

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

Developemnt.rb / test.rb'de aşağıdaki gibi daha özlü olabilir:

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

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

7

Ana bilgisayarı URL yardımcısına her zaman bir parametre olarak iletebilirsiniz:

listing_url(listing, host: request.host)

Not: Ayrıca bir bağlantı noktası da ekleyebilirsinizlisting_url(listing, host: request.host, port: 3000)
drhenner

Peki ya istek içeriğiniz yoksa? Denetleyici dışındaki çoğu şey gibi?
courtsimas


1

Aynı hatayla karşılaştım. Ben öğretici Liste 10.13 dahil olmak üzere, her şeyi doğru yazılmış vardı.

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

Açıkçası "example.com" sunucu sunucumun URL'si ile değiştirildi.

Ne öğretici üzerinde glossed vardı bu satır oldu:

Yapılandırmayı etkinleştirmek için geliştirme sunucusunu yeniden başlattıktan sonra ...

Benim için cevap sunucuyu kapatıp tekrar açmaktı.


1

config / environment / test.rb adresine gidin

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


2
Yanıtın daha fazla bilgiye ihtiyacı var. Lütfen çözüm olarak aslında ne önerdiğinizi açıklayın.
Levi Roberts

1
İşte Nasıl Yanıtlanacağına dair bazı yararlı ipuçları . Onlara atıfta bulunmak için yararlı buluyorum.
Garrett Motzner

1

birisinin ActiveStorage ile ilgili hataları aradığını fark etmesi durumunda:

yerel disk hizmeti ile yükleme URL'leri vb. oluşturmak istediğiniz bir denetleyici eyleminiz varsa (büyük olasılıkla test ortamında), düzgün çalışabilmek include ActiveStorage::SetCurrentiçin denetleyicide olması gerekir blob.service_url_for_direct_upload.


Teşekkür ederim! Bunu bir kontrolörün dışında kullanmak (GraphQL doğrudan yükleme mutasyonu) bu yüzden biraz ince ayar yapmak zorunda kaldı, ama çalışıyor. Bunu arıyordum, tekrar teşekkürler @phoet :)
Stan

0

Bazı durumlarda işe yaramasına rağmen rotalara default_url eklemek doğru çözüm değildir.

Her ortamda (geliştirme, test, üretim) default_url ayarını yapmanız gerekir.

Bu değişiklikleri yapmanız gerekiyor.

    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

Yukarıdaki cevap benim için işe yaramadı, en azından istediğim gibi. config.action_mailer.default_url_options = { host: "localhost", port: 3000 } Cihaz yükledikten sonra fark ettim . Umarım aynı problemi olan birine yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.