18

मैं ईमेल भेजने के लिए पीडीएफ और एक्शनमेलर के रूप में दृश्य प्रस्तुत करने के लिए Wicked_pdf का उपयोग कर रहा हूं, लेकिन मैं उन्हें एक साथ काम करने के लिए नहीं मिल सकता। मैं एक्शनमेलर का उपयोग करके एक ईमेल पर एक निश्चित दृश्य का एक पीडीएफ संस्करण संलग्न करना चाहता हूं और एक लिंक या बटन पर क्लिक करके इसे भेजना चाहता हूं। मेरे पास एक link_to आदेश है जो एक ईमेल भेजता है। यहाँ मेरी नियंत्रक है कि ईमेल हो जाता है उत्पन्न है:रेल 3-रेन्डर पीडीएफ देखें और ईमेल से संलग्न करें

def sendemail 
@user = User.find(params[:id]) 
Sendpdf.send_report(@user).deliver 
redirect_to user_path(@user) 
flash[:notice] = 'Email has been sent!' 
end 

यहाँ क्या मैं अपने ActionMailer में है:

class Sendpdf < ActionMailer::Base 
default :from => "[email protected]" 

def send_report(user) 
@user = user 
    attachment "application/pdf" do |a| 
    a.body = #Something should go here, maybe WickedPDF.new.something? 
    a.filename = 'MyPDF' 
end  
mail(:to => user.email, :subject => "awesome pdf, check it") 
end 

end 

मैं कई सवाल और जवाब, झींगा के साथ सबसे अधिक व्यवहार देखा है। ऐसा लगता है कि इसका एक सरल जवाब होना चाहिए। क्या कोई मदद कर सकता है?

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

उत्तर

6

इसके लिए 2 तरीके हैं।

  1. या तो, आप चाहते हैं पीडीएफ, ईमेल भेज रहे हैं में एम्बेड करने के लिए इतना है कि जब उपयोगकर्ता ईमेल से पीडीएफ डाउनलोड करता है, आपकी संबंधित नियंत्रक के लिए नए पीडीएफ कार्रवाई प्रस्तुत करने के लिए कोई अनुरोध है।
    मुझे नहीं पता कि यह कुशलतापूर्वक कैसे करें क्योंकि मैंने पहले कभी ऐसा नहीं किया है।

  2. या, आप बस अपने ईमेल में पीडीएफ के लिए एक लिंक प्रदान करते हैं और जब उपयोगकर्ता उस पर क्लिक करता है, तो अब पीडीएफ बनाने के लिए कार्रवाई कहा जाता है, और फिर उपयोगकर्ता इसे डाउनलोड कर सकता है।
    इस तरह, यदि पीडीएफ के डाउनलोड के लिए सर्वर पर बहुत अधिक बोझ है, तो आप इन अनुरोधों को कहीं और रीडायरेक्ट कर सकते हैं। संक्षेप में, दक्षता के लिए एक बड़ा गुंजाइश है।

2 विधि (कोड प्रदान की PDFkit का उपयोग करके लिखा गया था, तो उसके अनुसार बदल) के लिए एक नमूना कोड:

class PdfsController < ApplicationController 
    def pdf 
    respond_to do |format| 
     format.pdf { render :text => wickedPDF.new(Pdf.find(params[:id]).content).to_pdf } 
    end 
    end 
... 
end 

अपनी पसंद के अनुसार Pdf.find(params[:id]).content बदलें, और to_pdf विधि, के अनुसार wickedPDF।

फिर, आप बस पीडीएफ डाउनलोड के लिए लिंक आपके ईमेल में इस

<%= link_to "Download", pdf_pdf_path(pdf, :format => "pdf") %> 

या जो कुछ भी प्रति wickedPDF के रूप में सूट की तरह पारित कर सकते हैं।

1: इस तरह से आप चाहते हैं करने के लिए

+0

एक बढ़िया विकल्प है यही कारण है, मैं वास्तव में। इस बात का नहीं सोचा था कि अगर मैं अपने विकल्प नहीं है मैं ईमेल के लिए PDF संलग्न करने के लिए चाहते हैं लेकिन जब तक मैं इसे समझ नहीं पाता, ईमेल में "डाउनलोड" लिंक डालना एक अच्छा विचार है, धन्यवाद! – FattRyan

+0

यह प्रश्न के उत्तर देने का उत्तर नहीं देता है। कार्य के आसपास काम अक्सर सबसे अच्छा इस्तेमाल किया जाता है, जवाब नहीं। – ghayes

33

2 अच्छा तरीके नियंत्रक में पीडीएफ बनाएं, फिर एक परम रूप में ईमेल करने के लिए कि भेजें।

# controller 
def sendemail 
    @user = User.find(params[:id]) 
    pdf = render_to_string :pdf => 'MyPDF' 
    Sendpdf.send_report(@user, pdf).deliver 
    redirect_to user_path(@user) 
    flash[:notice] = 'Email has been sent!' 
end 

# mailer 
def send_report(user, pdf) 
    @user = user 
    attachments['MyPDF.pdf'] = pdf 
    mail(:to => user.email, :subject => "awesome pdf, check it") 
end 

2: मेलर सीधे में पीडीएफ बनाएँ (एक छोटे से अधिक शामिल है, लेकिन मॉडल से कहा जा सकता है)

def send_report(user) 
    @user = user 
    mail(:to => user.email, :subject => "awesome pdf, check it") do |format| 
    format.text # renders send_report.text.erb for body of email 
    format.pdf do 
     attachments['MyPDF.pdf'] = WickedPdf.new.pdf_from_string(
     render_to_string(:pdf => 'MyPDF',:template => 'reports/show.pdf.erb') 
    ) 
    end 
    end 
end 
+0

उत्तर देने के लिए धन्यवाद यह सवाल। मैंने जो किया वह एक फ़ाइल में पीडीएफ को सहेजने के लिए एक क्रिया बना रहा था। फिर मेल भेजने के लिए कार्रवाई में मैंने यह क्रिया कहा, इसे ईमेल से जोड़ा, फिर फ़ाइल से मिटा दिया। क्या यह बुरा है ऐसा करने का तरीका? यह बहुत अच्छा काम करता है। – FattRyan

+2

कोई बुरा तरीका नहीं है, लेकिन कभी-कभी फाइल सिस्टम को लिखना वांछित नहीं है, Heroku पर पसंद है। साथ ही, सावधान रहें कि आपकी फ़ाइलों को किसी अन्य प्रक्रिया द्वारा स्थानांतरित या हटाया नहीं जा सकता है। – Unixmonkey

+1

@Unixmonkey बस इसमें जोड़ने के लिए मैंने देखा है कि WickedPDF के बारे में अधिकतर उत्तर आपके हैं। मैंने आपके सभी उत्तरों पर उच्च और निम्न खोज की है और निम्न सेट अप है: https://gist.github.com/anonymous/5229508 लेकिन इसे नाखून नहीं लग रहा है। ऐसा लगता है कि मैंने जो भी समाधान किया है, वह मुझे 'टेम्पलेट गुम है' दे रहा है। आपके उत्तर की प्रतीक्षा में। – David

0
मैं आप क्या चाहते हैं के रूप में के लिए इसी तरह कुछ करने के लिए कोशिश कर रहा हूँ

, कर, हालांकि यह अभी तक काम नहीं कर रहा:

class UserMailer < ActionMailer::Base 
    require "open-uri" 
    include Rails.application.routes.url_helpers 

    default :from => "[email protected]" 

    def new_user(user) 
    @user = user 
    path_to_url = url_for({ :action=>"show", :controller=>"users", :format =>"pdf", :id => @user }) 
    file = open(path_to_url, "r") 
    attachments["user.pdf"] = file 
    mail(:to => @user.email, :subject => "New user ;)") 
    file.close 
    end 

end 

मूल रूप से यह (यह एक और प्रारूप के साथ कॉन्फ़िगर किया गया है) और देखने में ही प्रस्तुत करने के लिए फिर ईमेल करने के लिए इसे संलग्न कोशिश करता है।

केवल एक चीज है, कि यह काम नहीं कर रहा :(