2011-12-21 3 views
23

क्या कोई वैश्विक तरीका है जो मैं अपने उपयोगकर्ता मेलर के लिए पहले_फिल्टर लिख सकता हूं, यह जांचता है कि उपयोगकर्ता के पास ईमेल अक्षम हैं या नहीं? अभी मैंने प्रत्येक मेलर को उपयोगकर्ता की सेटिंग की जांच की है, यह बहुत अनावश्यक है। मैं इसे पहले_फिल्टर के द्वारा ड्रॉ करना चाहता हूं जो सभी मेलर्स के लिए काम करता है।UserMailer में पहले_फिल्टर को कैसे जोड़ना है जो जांचता है कि उपयोगकर्ता को मेल करना ठीक है या नहीं?

class UserMailer < ActionMailer::Base 

before_filter :check_if_we_can_mail_the_user 

.... 

private 

    def check_if_we_can_mail_the_user 
    if current_user.mail_me == true 
     #continue 
    else 
     Do something to stop the controller from continuing to mail out 
    end 
    end 
end 

संभव है? क्या किसी ने ऐसा कुछ किया है? धन्यवाद

+0

ऐसी कोई बात नहीं है, क्योंकि आप आमतौर पर इस तरह के तर्क को fe में डाल देंगे। उपयोगकर्ता मॉडल। दूसरी समस्या यह है कि कई मामलों में आप मेल एसिंचनस भेजते हैं और 'current_user' जैसी कोई चीज़ नहीं है – phoet

उत्तर

0

शायद https://github.com/kelyar/mailer_callbacks देखें। ऐसा लगता है कि यह वही करेगा जो आप चाहते हैं।

+3

आधुनिक पाठक के लिए: रेल 4 में अब मेलर कॉलबैक हैं: पहले_एक्शन, after_action, about_action http: // edgeguides। rubyonrails.org/action_mailer_basics.html#action-mailer-callbacks – olleolleolle

6

मैंने यह नहीं किया है, लेकिन मैंने एक ईमेल इंटरसेप्टर के साथ समान काम किया है।

class MailInterceptor  
    def self.delivering_email(message) 
     if User.where(:email => message.to).first.mail_me != true 
      message.perform_deliveries = false 
     end 
    end 
end 

आप तो आप ईमेल द्वारा उपयोगकर्ता है, जो पहले से ही 'को' क्षेत्र के रूप में मेल वस्तु में होना चाहिए लगता है, पहुँच current_user नहीं होगा।

ईमेल इंटरसेप्टर स्थापित करने के लिए एक अच्छा रेलस्कास्ट कवर है। http://railscasts.com/episodes/206-action-mailer-in-rails-3?view=asciicast

27

रेल 4 पहले से पहले_फिल्टर और बाद में कॉलबैक है। रेल 3 उपयोगकर्ताओं के लिए, उन्हें जोड़ने के लिए आश्चर्यजनक रूप से सरल है: केवल सार नियंत्रक :: कॉलबैक शामिल करें। यह change to Rails 4 की नकल करता है जो टिप्पणियों और परीक्षणों के अलावा, केवल कॉलबैक शामिल है।

class MyMailer < ActionMailer::Base 
    include AbstractController::Callbacks 

    after_filter :check_email 

    def some_mail_action(user) 
    @user = user 
    ... 
    end 

    private 
    def check_email 
    if @user.email.nil? 
     mail.perform_deliveries = false 
    end 
    true 
    end 

end 
+4

क्या यह "पहले_फिल्टर" नहीं होना चाहिए? क्यों "बाद"? – Kulgar

+1

हमारे पास पहले_फिल्टर में '@ user' चर नहीं है! और मेल अभी तक वितरित नहीं किया गया है। – caesarsol

+0

@ कुल्गार दस्तावेज़ वास्तव में समझाते हैं कि आप दोनों का उपयोग कर सकते हैं, लेकिन यदि आप after_filter का उपयोग करते हैं तो आप तर्क बना सकते हैं जो मेलर विधि पर सेट आवृत्ति चर पर निर्भर करता है: "आप मेल ऑब्जेक्ट को डिफॉल्ट, delivery_method_options या डालने के साथ पहले से क्रियान्वित करने के लिए उपयोग कर सकते हैं डिफ़ॉल्ट शीर्षलेख और अनुलग्नक। आप पहले_एक्शन के समान सेटअप करने के लिए बाद में कार्रवाई का उपयोग कर सकते हैं लेकिन आपके मेलर एक्शन में इंस्टेंस चर सेट कर सकते हैं। " (स्रोत: http://edgeguides.rubyonrails.org/action_mailer_basics.html#action-mailer-callbacks) – sandre89

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