2011-06-07 14 views
15

पृष्ठभूमि: हमारे ऐप में, हमारे पास बिक्री विक्रेता के कंप्यूटर (अक्सर ग्राहक) का उपयोग करके हमारे ग्राहक के लिए एक बिक्री प्रतिनिधि सेटअप होता है जब हम उन्हें सेट अप करते हैं तो उनके ईमेल तक पहुंच नहीं है)। तो हम बिक्री प्रतिनिधि के ईमेल पते के लिए तैयार पंजीकरण फॉर्म में एक फ़ील्ड जोड़ने की सोच रहे हैं और पुष्टि ईमेल भी उस ईमेल पते पर जाएं।रेल 3 + devise: उपयोगकर्ता के दूसरे ईमेल पते को जोड़ने के लिए पुष्टिकरण ईमेल के लिए मेलर विधि को संशोधित करने के लिए कैसे करें

प्रश्न: वहाँ एक रास्ता गुप्त प्रतिलिपि (या सीसी) प्रारंभिक पुष्टिकरण ईमेल के लिए वसीयत बताने के लिए है (केवल प्रारंभिक पुष्टिकरण ईमेल) एक (वैकल्पिक) "backup_email" ईमेल पते पर वह भी पर प्रदान की जाती है नया उपयोगकर्ता पंजीकरण फॉर्म?

वैकल्पिक रूप से, पुष्टि ईमेल प्रक्रिया को 'अक्षम' करने का कोई तरीका है, लेकिन केवल तभी जब पंजीकरण कोड में कोई निश्चित कोड दर्ज किया जाता है?

मुझे पता है कि तैयार पंजीकरण फॉर्म में कोई अन्य फ़ील्ड कैसे जोड़ना है, लेकिन मुझे नहीं लगता कि कैसे डिलीज मेलर कोड को संशोधित/कहां संशोधित किया जाए ताकि जब "ईमेल" पते पर एक पुष्टिकरण ईमेल भेजा जाए तो यह भी जाता है "backup_email" पता (यदि कोई है, कभी-कभी यह खाली होता है)।


जॉनी घास के लिए धन्यवाद!

मैं rails generate mailer CustomerUserMailer किया और कहा कि

#config/initializers/devise.rb 
config.mailer = "CustomUserMailer" 

अपने कस्टम मेलर की तरह दिखता है:

# app/mailers/customer_user_mailer.rb 
class CustomUserMailer < Devise::Mailer 
    def headers_for(action) 
    headers = { 
     :subject  => translate(devise_mapping, action), 
     :from   => mailer_sender(devise_mapping), 
     :to   => resource.email, 
     :cc   => resource.backup_user_email(action), 
     :template_path => template_paths 
    } 
    end 
end 

तो मैं (अन्यथा ईमेल खाली हैं)

views/devise/mailer से 3 मेलर टेम्पलेट्स ले जाया views/customer_user_mailer को

फिर मैंने User मॉडलनामक एक विधि जोड़ाजो उपयोगकर्ता रिकॉर्ड और कार्रवाई में डेटा के आधार पर 'बैकअप' ईमेल पता (यदि कोई है) देता है। केवल "चाल" यह है कि action का परीक्षण करते समय यह action == "confirmation_instructions" नहीं है action == :confirmation_instructions है।

उत्तर

11

एक तरह से यह Devise::Mailer

class MyMailer < Devise::Mailer 
    backup_email = "..." 
    def headers_for(action) 
    headers = { 
    :subject  => translate(devise_mapping, action), 
    :from   => mailer_sender(devise_mapping), 
    :to   => resource.email, 
    :bcc   => backup_email 
    :template_path => template_paths 
    } 
end 

में headers_for कार्रवाई ओवरराइड और अपने मेलर उपयोग करने के लिए वसीयत को बताने के लिए किया जाएगा करने के लिए:

#config/initializers/devise.rb 
config.mailer = "MyMailer" 
+0

एक सवाल ... जहां मुझे लगता है कि नई फ़ाइल को बचाने होगा? यह बहुत उपयोगी जानकारी है। बैकअप ईमेल प्रत्येक उपयोगकर्ता के पंजीकरण फॉर्म पर डेटा से आता है, उम्मीद है कि हम कुछ ऐसा उपयोग कर सकते हैं जैसे: bcc => resource.backup_email। – jpwynn

+1

आपको वास्तव में एक मेलर बनाना होगा, [इस गाइड] का पालन करें (http://guides.rubyonrails.org/action_mailer_basics.html) लेकिन इसे इसके बजाय 'डेविस :: मेलर' का सबक्लास बनाएं। – David

+0

परफेक्ट धन्यवाद। मैंने अपने मूल प्रश्न के अंत में परिवर्तनों को दस्तावेज किया है, क्योंकि मुझे मेलर एआरबी टेम्पलेट को नए दृश्य – jpwynn

13

बस मामले में किसी को भी गूगल के माध्यम से यहाँ मिल गया - में डेविस का नवीनतम संस्करण, header_for दो पैरामीटर लेता है। तो आपके कोड की आवश्यकता होगी:

class MyMailer < Devise::Mailer 
    backup_email = "..." 
    def headers_for(action, opts) 
    headers = { 
     :subject  => subject_for(action), 
     :to   => resource.email, 
     :from   => mailer_sender(devise_mapping), 
     :bcc   => backup_email, 
     :reply_to  => mailer_reply_to(devise_mapping), 
     :template_path => template_paths, 
     :template_name => action 
    }.merge(opts) 
    end 
end 

यह ऐसा करने का सबसे अच्छा तरीका नहीं हो सकता है, लेकिन कम से कम यह त्रुटियों से बचाता है।

+0

जब मैं ऐसा करता हूं तो मैं बिना किसी शरीर के ईमेल के साथ समाप्त होता हूं। सभी शीर्षलेख महान काम करते हैं। मैं नहीं देखता कि "टेम्पलेट पथ" कैसे परिभाषित किया गया है - क्या यह संभव है क्योंकि मैं जेनरेट किए गए विचारों का उपयोग कर रहा हूं, वे काम नहीं कर रहे हैं? – Calciphus

+0

कभी नहीं - यह पता चला है कि यदि मैं बदलता हूं: template_path से: ': template_path =>" devise/mailer "' मैं पहले से बनाए गए टेम्पलेट का उपयोग कर सकता हूं। – Calciphus

9

आप इस कोड है जो अधिक स्वच्छ और सरल

# app/mailers/my_mailer.rb 
class MyMailer < Devise::Mailer 
    def headers_for(action, opts) 
    backup_email = "..." 
    super.merge!({bcc: backup_email}) 
    end 
end 

# config/initializers/devise.rb 
... 
config.mailer = MyMailer 
... 

हैश के साथ आप जोड़ सकते हैं या किसी भी ईमेल हेडर आप चाहें तो संशोधित कर सकते हैं merge! विधि के लिए पारित किया है उपयोग कर सकते हैं।

0

आपका उत्तर मेरे लिए काम किया। बहुत बहुत धन्यवाद।

मेरे पास एक परिदृश्य था जिसमें मुझे 1 को अनुकूलित करने की आवश्यकता थी) बीसीसी में पर्यावरण के आधार पर विभिन्न ईमेल पर साइनअप पुष्टिकरण ईमेल भेजें। 2) ईमेल केवल साइनअप पुष्टिकरण मेल के लिए बीसीसी में जोड़ा जाना चाहिए।

कि प्राप्त करने के लिए, मैं कार्रवाई तर्क के लिए मान की तुलना में नीचे दिए गए कोड स्निपेट में दिखाया गया है जैसे:

def headers_for(action) 
    if action == :confirmation_instructions 
    if Rails.env.production? 
     recipient_email = "[email protected]" 
    else 
     recipient_email = "[email protected]" 
    end 

    headers = { 
     :subject => translate(devise_mapping, action), 
     :from => mailer_sender(devise_mapping), 
     :to => resource.email, 
     :bcc => recipient_email, 
     :template_path => template_paths 
    } 
    else 
    super 
    end 
end 
संबंधित मुद्दे