2011-02-25 10 views
7

का उपयोग कर मैं शायद कुछ स्पष्ट याद कर रहा हूँ, लेकिन मैं एक लोगो मैं ईमेल मैं अपने ऐप्लिकेशन से भेजे जाने के सभी में शामिल करना चाहते हैं मिल गया है सभी ईमेल के लिए एक ही लगाव का प्रयोग करें। मेरे पास एक मास्टर लेआउट है जिसका उपयोग मैं उन सभी मेलर्स के लिए कर रहा हूं। मुझे लगता है कि इसे DRY रखने के लिए एक तरीका है और फ़ाइल को प्रत्येक मेलर विधि में फ़ाइल संलग्न करने के लिए कोड जोड़ने की आवश्यकता नहीं है। क्या कोई मुझे सही दिशा में इंगित कर सकता है या विचार की मेरी रेखा को सही कर सकता है।रेल - लेआउट

धन्यवाद!

उत्तर

1
कि अपने मेलर यू जोड़ सकते हैं का उपयोग करता है लेआउट फ़ाइल में

निम्नलिखित

<%= image_tag('logo.png') %> 

मैं यह सोचते हैं कि मेल बाहर भेजा जा रहा html या बहुखण्डीय है।

इसके अलावा आपको पर्यावरण फ़ाइलों में बदलाव करने की आवश्यकता होगी। ActionMailer को डिफ़ॉल्ट base_url नहीं मिलता है। में वातावरण/development.rb उदाहरण के लिए मैं जोड़ा निम्नलिखित

config.action_mailer.default_url_options = { :host => "localhost:3000" } 

आप हो सकता है आप की तरह

class MyMailer < ActionMailer::Base 
    default :attachment => File.read(File.join(Rails.root,'public','images','logo.png')) 
end 
+1

नहीं है ... वह भी इस रूप में अच्छी तरह काम करने के लिए ... – sethvargo

+0

ओह, हाँ धन्यवाद कि उल्लेख करना भूल गया के लिए एक आधार यूआरएल सेट की जरूरत है। मैंने आपकी टिप्पणी के आधार पर अपना उत्तर संपादित किया है। – Shiv

+1

धन्यवाद, @Shiv। दुर्भाग्यवश यह वास्तव में मेरे प्रश्न का उत्तर नहीं देता है (जो शायद स्पष्ट नहीं था)। जहां मैं चीजों को चलाने में सक्षम नहीं हूं, जहां मैं DIY रखने में सक्षम नहीं हूं, मेलर कक्षाओं में है, जहां मुझे 'attachments.inline [' logo_small.png '] = file.read (' public/images/logo_small 'कहना है। पीएनजी ') 'प्रत्येक मेलर विधि में। क्या इसका कोई मतलब है? मैं अनुलग्नक जोड़ने के लिए एक DRY तरीका चाहते हैं। – dbwinger

2

मैं काट दिया कुछ कर सकते हैं (और अटैचमेंट के रूप में) एक सूखी ढंग से यह करना चाहते हैं थोड़ा सा, यह आदर्श नहीं है, लेकिन यह काम करता है।

आप

default "SOMEHEADER", Proc.new { set_layout } 

का उपयोग और फिर set_layout

def set_layout 
    attachments.inline["logo.png"] = File.read("logopath.png") 
    attachments.inline["footer.jpg"] = File.read("footerpath.png") 
    "SOME HEADER VALUE" 
end 

परिभाषित फिर क्योंकि set_layout हैडर सेट करने के लिए कहा जाता हो जाता है, यह भी इनलाइन अनुलग्नकों कहते हैं। यह मूल रूप से अनुलग्नक जोड़ने के लिए कॉलबैक बनाता है।

ActionMailer में एक वास्तविक कॉलबैक प्रणाली बेहतर होगा, लेकिन यह भी काम करता है।

सोचा मैं साझा करेंगे क्योंकि मैंने पहले आज इस प्रश्न पर इस उत्तर के लिए देख रहा था।

7

before_filter और after_filter का उपयोग कर कॉलबैक एक भविष्य रेल में समर्थन किया जाएगा जारी:

http://github.com/rails/rails/commit/4f28c4fc9a51bbab76d5dcde033c47aa6711339b

क्योंकि वे AbstractController :: कॉलबैक का उपयोग करके लागू किया जाएगा, तो आप कार्यक्षमता हो जाएगा नकल करने के लिए निम्न कर सकते हैं ActionMailer :: बेस में मौजूद एक बार रेल 4 जारी की है:

class YourMailer < ActionMailer::Base 
    if self.included_modules.include?(AbstractController::Callbacks) 
    raise "You've already included AbstractController::Callbacks, remove this line." 
    else 
    include AbstractController::Callbacks 
    end 

    before_filter :add_inline_attachments! 

    private 
    def add_inline_attachments! 
    attachments.inline["footer.jpg"] = File.read('/path/to/filename.jpg') 
    end 
end 

इस मॉड्यूल है कि भविष्य में उपयोग किया जाएगा शामिल संस्करण रेल, तो कॉलबैक हुक आप के लिए उपलब्ध भावी संगतता सुनिश्चित करने के लिए भी वही होगा। जब आप एक रेल संस्करण में अपग्रेड करने का प्रयास करते हैं तो कोड बढ़ जाएगा जिसमें पहले से ही नियंत्रक नियंत्रक :: कॉलबैक शामिल है, इसलिए आपको सशर्त तर्क को हटाने के लिए याद दिलाया जाएगा।

+0

इस टिप के लिए धन्यवाद। मुझे लगता है कि यहां 'सार कंट्रोलर :: कॉलबैक' का पुन: उपयोग करने में सक्षम होना बहुत अच्छा है, मुझे नहीं पता था कि यह इस तरह से किया जा सकता है! प्रत्येक मेलर में इनलाइन अटैचमेंट प्राप्त करने के लिए मेरी समस्या को हल करना, मैं अपने 'एप्लिकेशनमेलर' में शामिल एक समर्पित मॉड्यूल के माध्यम से सबकुछ कॉन्फ़िगर कर सकता हूं। – rchampourlier

-1

मैं तुम्हारे बारे में संलग्न इनलाइन चित्र पूछा है पता है, लेकिन यहां एक अलग दृष्टिकोण है कि कम जटिलता के साथ एक ही बात को प्राप्त होता है ..

html लेआउट में inline base64 encoded images का उपयोग करना है - कोई आवश्यक संलग्नक!

<img alt="example logo" 
    width="32px" 
    height="32px" 
    src="data:image/png;base64,iVBORw0KGgoAAA....."/> 

मैं पूरा <img /> टैग

यह दृष्टिकोण है पैदा करने के लिए http://www.base64-image.net ऑनलाइन base64 एनकोडर/विकोडक उपकरण का उपयोग:

मूल रूप से सिर्फ प्रारूप करने के लिए अपने लोगो छवि के src="..." बदल कुछ लाभ:
- कोई अनुलग्नक कोड, जो बैकएंड सर्वर कोड सीएल बनाता है eaner और
पढ़ने में आसान - ईमेल आकार में कोई वृद्धि - यह व्यापक रूप से समर्थित है - - इनलाइन छवि संलग्नक बेस 64 के लिए वैसे भी परिवर्तित कर रहे हैं ताकि इस दृष्टिकोण ईमेल पेलोड अन्य कोई बड़ी
नहीं है, तो प्राप्त ईमेल क्लाइंट html दिखा रहा है, यह वह इनलाइन अनुलग्नकों का उपयोग करना चाहता है, तो pretty likely it also supports this method

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