Как я могу запустить "скрипт cron" на heroku при взаимодействии с пользователем на Rails? - PullRequest
1 голос
/ 20 февраля 2011

У меня есть следующий скрипт, который запускается один раз в день на cron на heroku.

Однако я понимаю, что хотел бы, чтобы пользователь мог нажимать кнопку на веб-странице для запускаэтот же процесс.

Есть ли способ создать «подпрограмму», которую cron может вызвать или из веб-запроса?Я не хочу использовать отдельный сервис для запуска заданий.

Я только что добавил фрагмент для иллюстрации .....

letter_todos = Todo.current_date_lte(Date.today).asset_is("Letter").done_date_null

  unless letter_todos.blank? #check if there any ToDos

   # group by asset_id so that each batch is specific to the asset_id
   letter_todos.group_by(&:asset_id).each do |asset_id, letter_todos|
   #  pdf = Prawn::Document.new(:margin => 100) #format the PDF document
       html_file = ''
       letter_todos.each do |todo| #loop through all Letter_Todos

         contact = Contact.find(todo.contact_id) #get associated contact
         letter = Letter.find(todo.asset_id) #get associated Letter 

         redcloth_contact_letter = RedCloth.new(letter.substituted_message(contact, [])).to_html

         html_file = html_file + redcloth_contact_letter
         html_file = html_file + "<p style='display: none; page-break-after: always'><center> ... </center> </p>"

       end 

       kit = PDFKit.new(html_file)
       kit.stylesheets << "#{RAILS_ROOT}/public/stylesheets/compiled/pdf.css" 
       file = kit.to_pdf

       letter = Letter.find(asset_id)
       #OutboundMailer.deliver_pdf_email(file)
       kit.to_file("#{RAILS_ROOT}/tmp/PDF-#{letter.title}-#{Date.today}.pdf")

       # Create new BatchPrint record

       batch = BatchPrint.new
       batch.pdf = File.new("#{RAILS_ROOT}/tmp/PDF-#{letter.title}-#{Date.today}.pdf")

1 Ответ

0 голосов
/ 20 февраля 2011

Я сделал это, поместив соответствующую функцию в файл в lib (скажем, lib / tasks_n_stuff.rb):

module TasksNStuff
    def self.do_something
        # ...doing something...
    end
end

Тогда я могу вызвать if из задачи Rake:

desc 'Make sure we depend on :environment, so we can get to the Railsy stuff...'
task :do_something => :environment do
    TasksNStuff.do_something
end

Или из контроллера (или из любого места, на самом деле):

class WhateverController < ApplicationController
    def do_something
        TasksNStuff.do_something
    end
end

И поскольку вы можете запустить задачу rake как задание cron (cd /my/rails/root; rake do_something), это должно быть все, что вам нужнонеобходимость.Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...