Unable to select objects that do not respond - delayed_job on heroku

I try to use delayed_job for heroku and I get the following error:

Cannot enqueue items which do not respond to perform 

I am using the http://github.com/pedro/delayed_job plugin

I am using the following cron rake task (cron.rake):

 task :cron => :environment do require 'heroku' puts "starting the cron job at #{Date.today}" heroku = Heroku::Client.new(ENV['HEROKU_USER'], ENV['HEROKU_PASS']) heroku.set_workers(ENV['HEROKU_APP'], 1) Contact.all.each do |contact| email = contact.email_today #email_today is a contact method returning email object if <= today unless contact.email_today == "none" puts contact.first_name puts email.days puts contact.date_entered puts email.substituted_subject(contact,contact.colleagues) # create the Contact Email object that gets created and sent contact_email = ContactEmail.new contact_email.contact_id = contact.id contact_email.email_id = email.id contact_email.subject = email.substituted_subject(contact,contact.colleagues) contact_email.date_sent = Date.today contact_email.date_created = Date.today contact_email.body = email.substituted_message(contact, contact.colleagues) contact_email.status = "sent" Delayed::Job.enqueue OutboundMailer.deliver_campaign_email(contact,contact_email) contact_email.save #now save the record puts "save contact_email:" puts contact_email.inspect end #end unless end #end do heroku.set_workers(ENV['HEROKU_APP'], 0) puts "set heroku workers to 0" end 

This is the email program I use:

 class OutboundMailer < Postage::Mailer def campaign_email(contact,email) subject email.subject recipients contact.email from 'Me <me@me.com>' sent_on Date.today body :email => email end 

Question: Why am I getting an error message and what can I do to solve it?

+7
ruby-on-rails heroku delayed-job
source share
2 answers

A task is usually a ruby ​​object with a β€œexecute” method, therefore, enabling mail program delivery will not work, you will have to create a task object, as shown below

  class SomeMailJob <Struct.new (: contact,: contact_email) 
    def perform
      OutboundMailer.deliver_campaign_email (contact, contact_email)
    end
  end

Create some_mail_job.rb file and put it in / lib

and

in the above code, replace the enqueue statement

Delay :: Job.enqueue SomeMailJob.new (contact, contact_email)

+10
source share

If you do not need to pass other parameters to Delayed :: Job.enqueue, then this is a simpler solution:

 OutboundMailer.delay.deliver_campaign_email(contact,contact_email) 

FYI delay was called send_later , depending on the branch and version of delayed_job.

+2
source share

All Articles