2011-10-28 16 views
7

मैं रूबी के लिए नया और सोच कारण है कि मैं इस स्थिति में एक त्रुटि हो रही है एक सरल सिनात्रा अनुप्रयोग में 'मेल' मणि का उपयोग कर रहा हूँ:मेल ब्लॉक मेरे चर को क्यों नहीं देख सकता है?

post "/email/send" do 

    @recipient = params[:email] 

    Mail.deliver do 
    to @recipient # throws error as this is undefined 
    from '[email protected]' 
    subject 'testing sendmail' 
    body 'testing sendmail' 
    end 

    erb :email_sent 

end 

हालांकि यह ठीक काम करता है:

post "/email/send" do 

    Mail.deliver do 
    to '[email protected]' 
    from '[email protected]' 
    subject 'testing sendmail' 
    body 'testing sendmail' 
    end 

    erb :email_sent 

end 

मुझे संदेह है कि यह ब्लॉक गुंजाइश और इसके बारे में मेरी गलतफहमी के साथ कुछ करना है।

+1

क्या आप सुनिश्चित हैं कि आपकी समस्या उदाहरण var के साथ है, न कि 'पैराम्स [: ईमेल]' के साथ? क्या आपने इसे आउटपुट करने का प्रयास किया है? इसके अलावा एक स्थानीय चर पर्याप्त होना चाहिए, क्योंकि ब्लॉक वैसे भी बंद है। –

उत्तर

14

Julik कहते हैं, Mail#delivery जो केवल बदलता है self एक ब्लॉक (आप तरीकों #to और #from ब्लॉक के अंदर अन्यथा कॉल करने के लिए सक्षम नहीं होगा) चल रहा है, जबकि अपने ब्लॉक #instance_exec का उपयोग कर, निष्पादित करता है।

आप वास्तव में क्या कर सकते हैं इस तथ्य का उपयोग करना है कि बंद बंद हैं। जिसका अर्थ यह है कि यह इसके आसपास के सभी स्थानीय चर "याद करता है"।

recipient = params[:email] 
Mail.deliver do 
    to recipient # 'recipient' is a local variable, not a method, not an instance variable 
... 
end 

फिर से, संक्षेप में:

  • उदाहरण चर और विधि कॉल self
  • #instance_exec पर निर्भर self परिवर्तन,
  • स्थानीय चर self पर निर्भर नहीं हैं और ब्लॉक द्वारा याद किए जाते हैं क्योंकि ब्लॉक बंद हैं।
+0

और थोड़ा सा अतिरिक्त: यह व्यवहार रूबी के संस्करण पर निर्भर नहीं है। इसलिए मैं प्रश्न शीर्षक से "रूबी 1.9" शब्द निकाल दूंगा, यह भ्रमित हो सकता है। –

+0

तो मेरी गलती एक आवृत्ति चर का उपयोग कर रही थी? मैंने एक आवृत्ति चर का उपयोग किया क्योंकि मैं चाहता था कि ईआरबी टेम्पलेट में उपलब्ध डेटा और - यदि मुझे गलत नहीं है - इसका मतलब है कि इसे एक उदाहरण var होना चाहिए। मैं इसके आसपास काम कर सकता हूं, या तो स्थानीय चर घोषित करके, या टिन मैन के दृष्टिकोणों में से एक का उपयोग करके। धन्यवाद, अब तक रूबी से प्यार है, लेकिन सीखने के लिए बहुत कुछ :) –

3

मुझे लगता है कि ऐसा इसलिए है क्योंकि मेल मणि हुड के नीचे instance_exec का उपयोग करता है। instance_exec उस ऑब्जेक्ट से इंस्टेंस चर का उपयोग करता है जिसे कॉलर से नहीं कहा जाता है। मैं जो करूँगा वह मेल मणि में एक विधि पाता है जो इंस्टेंस चाल का उपयोग नहीं करता है लेकिन ब्लॉक पर एक स्पष्ट कॉन्फ़िगरेशन ऑब्जेक्ट पास करता है, और वहां से आगे बढ़ता है। कुछ ग्रे बाल बचाता है।

8

यदि आप Mail के लिए दस्तावेज़ों के माध्यम से पढ़ लेंगे तो आपको एक अच्छा वैकल्पिक समाधान मिलेगा जो काम करेगा।

Mail.deliver do 
    to @recipient # throws error as this is undefined 
    from '[email protected]' 
    subject 'testing sendmail' 
    body 'testing sendmail' 
end 

आप, मेल के new() विधि का उपयोग मानकों में गुजर सकते हैं, और ब्लॉक पर ध्यान न दें:

Mail.new(
    to:  @recipient, 
    from: '[email protected]', 
    subject: 'testing sendmail', 
    body: 'testing sendmail' 
).deliver! 

या वैकल्पिक हैश तत्व परिभाषाएँ:

Mail.new(
    :to  => @recipient, 
    :from => '[email protected]', 
    :subject => 'testing sendmail', 
    :body => 'testing sendmail' 
).deliver! 

जिज्ञासा में बल्कि उपयोग की तुलना में , या irb आप देखेंगे:

pry(main)> Mail.new(
pry(main)* to: '[email protected]', 
pry(main)* from: '[email protected]' << `hostname`.strip, 
pry(main)* subject: 'test mail gem', 
pry(main)* body: 'this is only a test' 
pry(main)*).deliver! 
=> #<Mail::Message:59273220, Multipart: false, Headers: <Date: Fri, 28 Oct 2011 09:01:14 -0700>, <From: [email protected]>, <To: [email protected]>, <Message-ID: <[email protected]>>, <Subject: test mail gem>, <Mime-Version: 1.0>, <Content-Type: text/plain>, <Content-Transfer-Encoding: 7bit>> 

new विधि में कई भिन्नताएं हैं जिनका आप उपयोग कर सकते हैं। यह डॉक्स भी से है, और बेहतर काम कर सकते हैं: एक मेल :: संदेश वस्तु सीधे बनाने और फिर स्ट्रिंग, प्रतीक या प्रत्यक्ष के माध्यम से मूल्यों में गुजर के माध्यम से

एक तरफ ध्यान दें के रूप में, आप भी एक नया ईमेल बना सकते हैं विधि कॉल अधिक जानकारी के लिए मेल :: संदेश देखें।

mail = Mail.new 
mail.to = '[email protected]' 
mail[:from] = '[email protected]' 
mail['subject'] = 'This is an email' 
mail.body = 'This is the body' 

mail.deliver! द्वारा पीछा किया।

यह भी ध्यान दें, पिछले उदाहरण में, संदेश लिफाफा में विभिन्न शीर्षकों तक पहुंचने के कई तरीके हैं। यह एक लचीला मणि है जो अच्छी तरह से सोचा जाता है और रूबी मार्ग का पालन करता है।

+0

मेरे लिए यह शोध करने के लिए धन्यवाद :) मैं रूबीगेम्स को देखने के बजाय गिटहब दस्तावेज़ों पर बहुत करीब से देख रहा था। सबक सीखा। एक बार फिर धन्यवाद। –

संबंधित मुद्दे