我目前正在开发一个 ruby on rails 项目。我需要系统根据数据库中的信息每 12 小时自动生成一个 PDF。
目前我正在查看 prawn gem 来生成 PDF,但我想知道是否有办法让这个 gem(或任何其他)每隔这么多小时生成一次 PDF。
我目前正在开发一个 ruby on rails 项目。我需要系统根据数据库中的信息每 12 小时自动生成一个 PDF。
目前我正在查看 prawn gem 来生成 PDF,但我想知道是否有办法让这个 gem(或任何其他)每隔这么多小时生成一次 PDF。
如果您知道如何通过 Ruby(使用prawn
或wicked_pdf
)生成 PDF,则只需执行 2 个步骤:
创建一个 rake 任务,调用它,如下所示:
# lib/tasks/my_pdf_task.rake
desc "Generate pdf"
task :generate_pdf => :environment do
MyPdfGenerator.new.generate
end
通过 cron 运行它,无论何时使用gem。安装和初始化 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