ไม่มีโฮสต์ที่จะลิงก์ไปยัง! โปรดระบุ: พารามิเตอร์โฮสต์หรือตั้ง default_url_options [: host]


183

ฉัน googling ประมาณ 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" }

ด้วยวิธีนี้มันสามารถทำงานได้ในทุกสภาพแวดล้อมและอาจแตกต่างจากสภาพแวดล้อมสู่สภาพแวดล้อม ตัวอย่างเช่น:

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
ตรวจสอบให้แน่ใจว่าคุณรีสตาร์ทเซิร์ฟเวอร์ rails ของคุณหลังจากเพิ่ม ไฟล์ภายใต้ config / จะไม่ถูกโหลดซ้ำโดยอัตโนมัติ
Stenerson

3
ฉันได้ทำสิ่งนี้คล้ายกันมากและการตั้งค่า default_url_option สำหรับ action_mailer จะไม่ช่วยอะไร กรณีการใช้งานคล้ายกับสิ่งนี้: Rails.application.routes.url_helpers.message_image_url (2)
Boti

1
ทำสิ่งนี้ ไม่ว่าจะมีหรือไม่มี www ... คำนำหน้าชื่อโฮสต์ในการผลิตฉันยังคงได้รับข้อผิดพลาดเดียวกัน เพิ่มเส้นทางต่อ @ d11wtq และใช้งานได้ มีการเปลี่ยนแปลง Rails4 บางอย่างที่ทำให้เกิดพฤติกรรมนี้หรือไม่? ฉันไม่เคยเห็นมันมาก่อนการอัพเกรดและมีเพียงหนึ่งในการส่งจดหมายทางไปรษณีย์ (ประดิษฐ์โดยอัตโนมัติ) เท่านั้น
JosephK

สามารถยืนยันได้ว่าสิ่งนี้ใช้ไม่ได้กับ 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 ที่แตกต่างกัน
Neil Middleton

2
ใช่คุณจะทำอย่างไรถ้าคุณมีหลายโดเมน env
wejrowski

สมมุติคุณเพียงแค่ระบุว่าสำหรับแต่ละ URL แทนทั้งในเส้นทางเดินรถหรือในการภาวนาผู้ช่วย listing_url(listing, :host => "whatever.com")url:
d11wtq

14
ในไฟล์กำหนดค่าสำหรับแต่ละสภาพแวดล้อมฉันเพิ่มตัวเลือกที่กำหนดเองนี้: config.domain = 'staging.myapp.com'(แน่นอนแทนในชื่อโดเมนที่ถูกต้องสำหรับแต่ละ env) จากนั้นในroutes.rbฉันใช้งานฟรีdefault_url_options host: Rails.application.config.domainและมันจะทำงานในสภาพแวดล้อมใด ๆ ไม่เป็นไร
Prathan Thananart

10
วิธีที่ดีกว่าคือภายในไฟล์เส้นทางให้ทำดังนี้: default_url_options Rails.application.config.action_mailer.default_url_options.
siannopollo

42

ควรระบุโฮสต์ในไฟล์ปรับแต่งของแต่ละสภาพแวดล้อม เช่น:

config/environments/development.rb

ดูคำถามนี้และคำถามนี้


4
ขอบคุณ IMHO นี่เป็นคำตอบที่ดีกว่าคำตอบที่ใช้ route.draw
joelparkerhenderson

1
คำตอบนี้ไม่ได้ช่วยเมื่อใช้โดเมนที่แตกต่างกันและแก้ไขปัญหาอื่น ๆ
Ryan

1
@ Ryan คุณสามารถใช้ vars เพื่อแก้ไขปัญหาได้
Courtsimas

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

เปลี่ยน Hat เป็น@pduerstelerเพื่อพาฉันไปสู่เส้นทางนี้


2
การตั้งค่าconfig/environment.rbตามที่คุณอธิบายเป็นกุญแจสำคัญในการทำให้จดหมายของฉันทำงานในคอนโซล ขอบคุณ!
Eric D. Fields

@ EricD.Fields คุณยินดีมาก Eric! ฉันพบว่ามันมีประโยชน์มากจนฉันคิดว่ามันควรจะสร้างขึ้นในแกนของ Rails
Joshua Pinter

นั่นน่าจะเป็นRails.application.default_url_options = Rails.application.config.action_mailer.default_url_optionsRails 5.2+
Sandro L

ขอบคุณ @SandroL! เรายังอยู่ใน Rails 4.2 ดังนั้นยังไม่ได้ทดสอบในเวอร์ชั่นที่ใหม่กว่า
Joshua Pinter

บางคนแนะนำสิ่งนี้ ฉันเดาว่าคนมักจะตั้งค่า action_mailer.default_url_options ไว้แล้วด้วยเหตุผลทางประวัติศาสตร์ แต่มันมีเหตุผลมากกว่าหรือไม่ที่จะตั้งค่านั้นโดยใช้ application.default_url_options แทนที่จะเป็นวิธีอื่น ทำไมต้องมีการอ้างอิงจดหมายปลอมเมื่อกำหนดค่าว่าลิงก์เว็บไซต์ของคุณทำงานอย่างไร
Harry Wood

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.Not :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 workers

แนวทางของฉันจนถึงตอนนี้ซึ่งไปสู่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
คิดดีมาก @pestesteler! จริงๆแล้วฉันใช้ขั้นตอนนี้ไปอีกขั้นหนึ่งและสามารถเพิ่มหนึ่งบรรทัดในconfig/environment.rbไฟล์เพื่อทำสิ่งนี้ และเพิ่มคำตอบที่ให้รายละเอียดเพิ่มเติม: stackoverflow.com/a/48529627/293280ขอขอบคุณที่ชี้นำฉันในทิศทางนี้
Joshua Pinter

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 เริ่มต้นใน 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


นี่เป็นทางออกที่ดีสำหรับ 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

ไปที่ config / environment / test.rb

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


2
คำตอบต้องการข้อมูลเพิ่มเติม โปรดอธิบายสิ่งที่คุณเสนอให้เป็นวิธีแก้ปัญหา
Levi Roberts

1
นี่คือบางส่วนเคล็ดลับที่เป็นประโยชน์ในการมีวิธีการคำตอบ ฉันพบว่ามีประโยชน์ในการอ้างอิง
Garrett Motzner

1

ในกรณีที่มีคนค้นหาการค้นหาข้อผิดพลาดที่เกี่ยวข้องกับ ActiveStorage นี้:

หากคุณมีตัวควบคุมแอ็คชั่นที่คุณต้องการสร้างไฟล์อัพโหลด ฯลฯ ด้วยบริการดิสก์ในพื้นที่ (ส่วนใหญ่มีแนวโน้มในสภาพแวดล้อมการทดสอบ) คุณจำเป็นต้อง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 สำหรับ action mailer สำหรับแต่ละสภาพแวดล้อมเช่นการพัฒนาการทดสอบการจัดเตรียมและการผลิตเป็นต้น

การอ้างอิง: ไม่มีโฮสต์ที่จะลิงก์! โปรดระบุ: พารามิเตอร์โฮสต์หรือตั้งค่า default_url_options [: host]


0

คำตอบข้างต้นไม่ได้ผลสำหรับฉันอย่างน้อยก็ไม่เป็นอย่างที่ฉันต้องการ ฉันรู้ config.action_mailer.default_url_options = { host: "localhost", port: 3000 } หลังจากติดตั้งอุปกรณ์ หวังว่ามันจะช่วยคนที่มีปัญหาเดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.