Host tidak ada untuk ditautkan! Harap berikan: parameter host atau setel default_url_options [: host]


183

Saya telah googling sekitar 90 menit sekarang dan masih belum punya jawaban untuk ini. Di mana saya mengatur default_url_options? Saya sudah mengaturnya untuk config.action_mailer.default_url_optionsmenyelesaikan bug yang sama di tempat lain, tetapi sekarang saya mendapatkan kesalahan ini ketika mencoba menggunakan bantuan URL di dalam spesifikasi RSpec. Saya tidak tahu di mana mengharapkan default_url_options akan ditetapkan.

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

Kode ini tidak ada hubungannya dengan email / ActionMailer, kebetulan membutuhkan URL alih-alih jalur.

Ada ide?


Apa yang dimaksud dengan tuan rumah?
Jwan622

Jawaban:


260

Anda perlu menambahkan baris berikut di setiap lingkungan:

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

Dengan begitu, ia dapat bekerja di semua lingkungan dan bisa berbeda dari lingkungan ke lingkungan. Sebagai contoh:

pengembangan.rb

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

test.rb

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

produksi

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

16
Pastikan juga Anda me-restart server rails Anda setelah Anda menambahkan ini. File-file di bawah config / tidak secara otomatis dimuat ulang.
Stenerson

3
Saya telah melakukan hal yang sangat mirip dengan ini dan pengaturan default_url_option untuk action_mailer tidak akan membantu. Kasus penggunaan mirip dengan ini: Rails.application.routes.url_helpers.message_image_url (2)
Boti

1
Melakukan ini; dengan atau tanpa www ... awalan nama host dalam produksi, saya masih mendapat kesalahan yang sama. Menambahkan rute per @ d11wtq, dan itu berhasil. Apakah ada beberapa perubahan Rails4 yang menyebabkan perilaku ini? Saya tidak pernah melihatnya sebelum peningkatan, dan hanya dalam satu pengiriman surat tertentu (dirancang otomatis), sejak itu.
JosephK

Dapat mengkonfirmasi bahwa ini tidak berfungsi di proyek Rails 4 saya. Mengaturnya di rute sama sekali tidak ada pilihan.
b1nary

4
Tidak bekerja di Rails 5. Ditambahkan default_url_options Rails.application.config.action_mailer.default_url_optionsmeskipun dan itu berhasil, seperti yang disarankan oleh komentator lain
BooBailey

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

  # ... snip ...
end

Di suatu tempat di routes.rb:)


35
Tidak terlalu baik jika Anda memiliki banyak lingkungan berbeda dengan URL yang berbeda
Neil Middleton

2
Ya apa yang Anda lakukan jika Anda memiliki beberapa domain env?
wejrowski

Mungkin Anda hanya menentukan untuk setiap URL sebaliknya, baik di peta rute, atau di url helper doa: listing_url(listing, :host => "whatever.com").
d11wtq

14
Dalam file konfigurasi untuk setiap lingkungan masing-masing, saya menambahkan opsi khusus ini: config.domain = 'staging.myapp.com'(tentu saja ganti nama domain yang benar untuk setiap env). Kemudian routes.rbsaya bebas menggunakan default_url_options host: Rails.application.config.domaindan itu akan bekerja di lingkungan apa pun. Sama-sama.
Prathan Thananart

10
Pendekatan yang lebih baik akan, dalam file-rute, lakukan ini: default_url_options Rails.application.config.action_mailer.default_url_options.
siannopollo

42

Tuan rumah harus ditentukan dalam file konfigurasi masing-masing lingkungan. Misalnya:

config/environments/development.rb

Lihat pertanyaan ini dan pertanyaan ini .


4
Terima kasih, IMHO ini adalah jawaban yang lebih baik daripada jawaban yang menggunakan routes.draw
joelparkerhenderson

1
Jawaban ini tidak membantu ketika menggunakan domain yang berbeda dan mengatasi masalah lain.
Ryan

1
@Ryan Anda bisa menggunakan vars lingkungan untuk memperbaikinya
courtimas

35

Atur default_url_optionsuntuk menggunakan action_mailer.default_url_options.

Dalam setiap file lingkungan Anda (misalnya development.rb, production.rb, dll) Anda dapat menentukan default_url_optionspenggunaan untuk action_mailer:

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

Namun, ini tidak diatur untuk MyApp:Application.default_url_options:

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

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

Itu sebabnya Anda mendapatkan kesalahan dalam hal di luar ActionMailer.

Anda dapat mengatur aplikasi Anda yang default_url_optionsmenggunakan apa yang Anda tetapkan untuk action_mailerdalam file lingkungan yang sesuai ( development.rb, production.rb, dll).

Untuk menjaga keadaan tetap KERING mungkin, lakukan ini di config/environment.rbfile Anda sehingga Anda hanya perlu melakukan ini sekali:

# 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

Sekarang ketika Anda mem-boot aplikasi Anda, seluruh Aplikasi Anda default_url_optionsakan cocok dengan Anda 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"}

Kiat tip ke @pduersteler karena telah membawaku ke jalan ini.


2
Menyiapkan config/environment.rbseperti yang Anda gambarkan adalah kunci untuk membuat mailer saya berfungsi di konsol. Terima kasih!
Eric D. Fields

@ EricD.Fields Terima kasih banyak, Eric! Saya menemukan ini sangat berguna sehingga saya pikir itu harus dibangun ke dalam inti Rails.
Joshua Pinter

Itu Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_optionsuntuk Rails 5.2+
Sandro L

Terima kasih, @SandroL! Kami masih menggunakan Rails 4.2 jadi belum menguji pada versi yang lebih baru.
Joshua Pinter

Beberapa orang merekomendasikan ini. Saya kira itu hanya karena orang cenderung memiliki action_mailer.default_url_options sudah dikonfigurasi untuk alasan historis, tetapi bukankah lebih logis untuk mengatur yang didasarkan pada application.default_url_options daripada sebaliknya? Mengapa melibatkan referensi pengirim palsu ketika mengkonfigurasi cara kerja tautan situs web Anda?
Harry Wood

24

Ketika Anda menggunakan listing_urlmetode apa pun , URL lengkap akan dikembalikan (bukan yang relatif seperti biasa). Itu sebabnya rails meminta Anda untuk host, untuk menghitung seluruh URL.

Bagaimana Anda bisa tahu rel tuan rumah? Anda dapat melakukannya dengan beberapa cara:

1.Menambahkan opsi ini ke setiap lingkungan:

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

CATATAN: Jika Anda bekerja di dalam mesin kereta api ingatlah untuk melakukan hal yang sama untuk aplikasi tiruan Anda di dalam tes mesin: path_to_your_engine/test/dummy/config/environments/*karena ketika Anda menguji mesin itu yang menguji coba terhadap kereta api.

2. Tambahkan opsi host ke metode foo_url seperti ini:

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

3.Tidak menampilkan host dengan opsi:only_path to true .

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

IMHO saya tidak melihat titik yang satu ini karena dalam hal ini saya akan menggunakan listing_pathmetode ini


Langkah 1 selalu bekerja untuk saya dan hari ini, menggunakan permata kilang-cms hanya langkah 2 menyelamatkan saya. Terima kasih atas komentarnya.
lucianosousa

15

Lucunya, pengaturan config.action_mailer.default_url_optionsitu tidak membantu saya. Juga, bermain-main dengan pengaturan yang tidak tergantung lingkungan di tempat-tempat yang saya rasa bukan miliknya tidak memuaskan bagi saya. Selain itu, saya menginginkan solusi yang berfungsi saat membuat url di sidekiq / resque pekerja.

Pendekatan saya sejauh ini, yaitu 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

Ini bekerja untuk saya di rails> = 3.2.x.


1
Ini dan hanya ini yang berfungsi untuk membuat pengirim memasukkan URL, tetapi itu merusak fungsi link_to lainnya di aplikasi saya.

1
Pemikiran yang bagus, @pduesteler! Saya benar-benar mengambil langkah ini lebih jauh dan dapat menambahkan hanya satu baris dalam config/environment.rbfile untuk melakukan ini. Dan menambahkan jawaban yang masuk ke detail: stackoverflow.com/a/48529627/293280 Terima kasih telah menunjukkan saya ke arah ini.
Joshua Pinter

9

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

Di developemnt.rb / test.rb, bisa lebih ringkas sebagai berikut:

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

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

7

Anda selalu dapat mengirimkan host sebagai parameter ke pembantu URL:

listing_url(listing, host: request.host)

Catatan: Anda dapat menambahkan port jugalisting_url(listing, host: request.host, port: 3000)
drhenner

Tetapi bagaimana jika Anda tidak memiliki konteks permintaan? Seperti dalam banyak hal selain controller?
courtimas


1

Saya memiliki kesalahan yang sama. Saya memiliki semua yang ditulis dengan benar, termasuk Listing 10.13 dari tutorial.

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

jelas dengan "example.com" diganti dengan url server saya.

Apa yang saya sampaikan dalam tutorial adalah baris ini:

Setelah memulai ulang server pengembangan untuk mengaktifkan konfigurasi ...

Jadi jawaban bagi saya adalah mematikan dan menghidupkan kembali server.


1

pergi ke config / environment / test.rb

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


2
Jawab butuh informasi lebih lanjut. Tolong jelaskan apa yang sebenarnya Anda usulkan sebagai solusinya.
Levi Roberts

1
Berikut adalah beberapa tips bermanfaat tentang Cara Menjawab . Saya menemukan mereka berguna untuk merujuk.
Garrett Motzner

1

untuk berjaga-jaga seandainya seseorang menemukan pencarian ini untuk kesalahan tentang ActiveStorage:

jika Anda memiliki aksi-controller di mana Anda ingin membuat url unggah dll dengan layanan disc lokal (kemungkinan besar di lingkungan pengujian), Anda perlu include ActiveStorage::SetCurrentdi controller untuk memungkinkan blob.service_url_for_direct_uploaduntuk bekerja dengan benar.


Terima kasih! Menggunakan ini di luar controller (mutasi upload langsung GraphQL) sehingga harus sedikit tweak, tetapi berfungsi. Saya sudah mencari ini, terima kasih lagi @phoet :)
Stan

0

Menambahkan default_url di rute bukan solusi yang tepat, tetapi berfungsi untuk beberapa kasus.

Anda harus mengatur default_url di setiap lingkungan (pengembangan, pengujian, produksi).

Anda perlu melakukan perubahan ini.

    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

Jawaban di atas tidak bekerja untuk saya, setidaknya tidak seperti yang saya inginkan. Saya menyadari config.action_mailer.default_url_options = { host: "localhost", port: 3000 } setelah menginstal merancang. Semoga ini akan membantu seseorang dengan masalah yang sama.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.