लिंक करने के लिए होस्ट की याद आ रही है! कृपया प्रदान करें: होस्ट पैरामीटर या डिफ़ॉल्‍ट_अर्ल_ओपेशन सेट करें: [मेज़बान]


183

मुझे अब लगभग 90 मिनट हो गए हैं और अभी भी इसका जवाब नहीं है। मैं कहाँ सेट default_url_optionsकरूँ? मैंने पहले ही इसे config.action_mailer.default_url_optionsइसी बग के लिए कहीं और हल करने के लिए सेट कर दिया है, लेकिन अब मुझे यह त्रुटि तब हो रही है जब एक RSCec युक्ति के अंदर URL हेल्पर का उपयोग करने की कोशिश की जा रही है। मुझे यह पता नहीं है कि यह कहां डिफ़ॉल्ट होना तय है।

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

इस कोड का ईमेल / एक्शनमेलर से कोई लेना-देना नहीं है, यह सिर्फ एक पथ के बजाय URL की आवश्यकता के लिए होता है।

कोई विचार?


वैसे भी मेजबान क्या है?
Jwan622 3

जवाबों:


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
यह भी सुनिश्चित करें कि इसे जोड़ने के बाद आप अपने रेल सर्वर को पुनः आरंभ करें। विन्यास के तहत फाइलें / स्वचालित रूप से पुनः लोड नहीं की जाती हैं।
स्टेनरसन

3
मैंने इस पर बहुत कुछ किया है और क्रिया के लिए default_url_option सेट करने से मदद नहीं मिलेगी। उपयोग का मामला इसके समान है: Rails.application.routes.url_helpers.message_image_url (2)
बोटी

1
इसे किया; www के साथ या उसके बिना ... उत्पादन में मेजबान नाम को उपसर्ग करते हुए, मुझे अभी भी वही त्रुटि मिली है। @ D11wtq प्रति रूट जोड़ा गया, और इसने काम किया। क्या कुछ रेल 4 परिवर्तन हैं जो इस व्यवहार का कारण बने? मैंने इसे अपग्रेड से पहले कभी नहीं देखा, और केवल एक विशेष मेल-सेंड (डेविस-ऑटोमेटेड) में, क्योंकि।
जोसेफ

पुष्टि कर सकते हैं कि यह मेरे रेल 4 परियोजनाओं में काम नहीं करता है। इसे रूटों में सेट करना कोई विकल्प नहीं है।
b1nary

4
में रेल 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
बहुत अच्छा नहीं है अगर आपको अलग-अलग यूआरएल के साथ कई अलग-अलग वातावरण मिले हैं
नील मिडलटन

2
यदि आपके पास कई एनवी डोमेन हैं तो आप क्या करते हैं?
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
सियानोपोलो

42

होस्ट को प्रत्येक वातावरण की कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट किया जाना चाहिए। उदाहरण के लिए:

config/environments/development.rb

इस प्रश्न और इस प्रश्न को देखें ।


4
धन्यवाद, IMHO इस जवाब से एक बेहतर जवाब है कि का उपयोग करता है routes.draw है
joelparkerhenderson

1
यह जवाब विभिन्न डोमेन का उपयोग करते समय मदद नहीं करता है और अन्य समस्याओं को संबोधित करता है।
रयान

1
@ रेयान को ठीक करने के लिए आप सिर्फ पर्यावरण वेरिएंट का उपयोग कर सकते हैं
4

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 , आदि)।

जितना हो सके DRY में चीजों को रखने के लिए, इसे अपनी 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.application.default_url_options = Rails.application.config.action_mailer.default_url_optionsरेलगाड़ियों 5.2+
सैंड्रो एल

धन्यवाद, @SandroL! हम अभी भी 4.2 रेल पर हैं, इसलिए बाद के संस्करणों पर अभी तक परीक्षण नहीं किया है।
जोशुआ पिंटर

इसकी सिफारिश कुछ लोग कर रहे हैं। मुझे लगता है कि लोगों को एक्शन_मेलर.डेफ़ॉल्ट_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 हमेशा मेरे लिए काम करता है और आज, रिफाइनरी-सेमी जेम का उपयोग करके चरण 2 मुझे बचाते हैं। टिप्पणी के लिए धन्यवाद।
लूसियानोसौसा

15

मजेदार बात, कि सेटिंग config.action_mailer.default_url_optionsमेरे लिए मदद नहीं करती है। इसके अलावा, पर्यावरण-स्वतंत्र सेटिंग्स के साथ उन जगहों पर गड़बड़ करना, जहां मुझे लगा कि यह मेरे लिए संतोषजनक नहीं है। इसके अतिरिक्त, मैं एक ऐसा समाधान चाहता था, जो साइडकीक / रेस्क्यू वर्कर्स में उरल्स बनाते समय काम करता हो।

मेरा दृष्टिकोण अब तक, जो इस प्रकार है 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 को शामिल करने के लिए मेलर प्राप्त करने के लिए काम करता है, लेकिन यह मेरे ऐप में अन्य लिंक_ कार्यों को तोड़ता है।

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)
ड्रेनर

लेकिन क्या होगा अगर आपके पास अनुरोध संदर्भ नहीं है? एक नियंत्रक के अलावा अन्य चीजों की तरह?
कोर्टिमेस

3

आप एप्लिकेशन कंट्रोलर में डिफ़ॉल्ट यूआरएल विकल्प सेट कर सकते हैं:

class ApplicationController < ActionController::Base
  def default_url_options
    {:locale => I18n.locale}
  end
end

http://guides.rubyonrails.org/action_controller_overview.html#default_url_options


यह रेल 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
उत्तर के लिए अधिक जानकारी चाहिए। कृपया वर्णन करें कि यह आप वास्तव में क्या समाधान के रूप में प्रस्ताव कर रहे हैं।
लेवी रॉबर्ट्स

1
हाउ टू आंसर के कुछ उपयोगी टिप्स इस प्रकार हैं । मुझे उन्हें संदर्भित करने के लिए उपयोगी लगता है।
गैरेट मोत्ज़नेर

1

यदि कोई व्यक्ति इस खोज को ActiveStorage से संबंधित त्रुटियों के लिए खोजता है:

यदि आपके पास एक नियंत्रक-क्रिया है, जहां आप स्थानीय डिस्क-सेवा (परीक्षण वातावरण में सबसे अधिक संभावना) के साथ अपलोड-यूआरएल आदि उत्पन्न करना चाहते हैं, तो आपको सही ढंग से काम include ActiveStorage::SetCurrentकरने की अनुमति देने के blob.service_url_for_direct_uploadलिए नियंत्रक में आवश्यकता है।


धन्यवाद! एक नियंत्रक के बाहर इसका उपयोग करना (ग्राफक्यूएल डायरेक्ट अपलोड म्यूटेशन) इसलिए इसे थोड़ा मोड़ना पड़ा, लेकिन काम करता है। मैं इस के लिए देख रहा हूँ, धन्यवाद फिर से @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

मैंने पर्यावरण को कॉन्फ़िगर करके समस्या को हल कर दिया है

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.