現在、Ruby on Rails プロジェクトに取り組んでいます。データベースからの情報に基づいて、12 時間ごとに PDF を自動的に生成するシステムが必要です。
現在、PDFを生成するためにエビの宝石を見ていますが、この宝石(または他の宝石)が何時間もPDFを生成する方法があるかどうか疑問に思っていました。
現在、Ruby on Rails プロジェクトに取り組んでいます。データベースからの情報に基づいて、12 時間ごとに PDF を自動的に生成するシステムが必要です。
現在、PDFを生成するためにエビの宝石を見ていますが、この宝石(または他の宝石)が何時間もPDFを生成する方法があるかどうか疑問に思っていました。
prawn
Ruby 経由で (またはを使用して) PDF を生成する方法を知っている場合wicked_pdf
、実行する手順は 2 つだけです。
rake タスクを作成し、次のように呼び出します。
# lib/tasks/my_pdf_task.rake
desc "Generate pdf"
task :generate_pdf => :environment do
MyPdfGenerator.new.generate
end
いつでもgemを使用して、cron経由で実行します。gem をインストールして初期化したら、以下を編集しconfig/schedule.rb
ます。
# config/schedule.rb
every 3.hours do
rake "generate_pdf"
end
このようなことは、Wicked PDFを使用して実現できます。私の過去の理解とあなたの質問から、添付ファイル pdf を含むある種の電子メールを生成したいようです。私の立場が正しければ、メーラーにこのようなものが入っているはずです。
def overtime_pdf(user, booking)
@bookings = booking
@user = user
mail(:subject => 'Overtime', :to => user.email) do |format|
format.text # renders overtime_pdf.text.erb for body of email
format.pdf do
attachments['bookings.pdf'] = WickedPdf.new.pdf_from_string(
render_to_string(:pdf => 'overtime', :template =>
'bookings/index.pdf.erb', :layouts => 'pdf.html')
)
end
end
end
これを行うと、herokuを使用している場合はheroku-scheduler
. あなたがしたいのは、ユーザー引数を取るクラスメソッドを作成することです。次に、コントローラーアクションでユーザーを渡し、これを rake タスクで使用できます。だから、あなたはこのようなものを持つことができます。
クラス
def self.send_overtime_mail(user, bookings)
BookingMailer.booking_pdf(user, bookings).deliver
end
レーキタスク
task :overtime_report => :environment do
every 3.hours do
user = User.where(:role => :administrator).first
bookings = Bookings.where(:day => Date.today.beginning_of_month..Date.today.end_of_month)
Booking.send_overtime_mail(user, bookings)
end
end