0

我有一个我创建的名为的方法,get_primary_email(user)它在我的 application_controller.rb 文件中。

现在我在我的应用程序以及调用使用方法的 cron 作业中都使用了这个方法get_primary_email(user)

我的问题是,如果我将方法定义为:

def get_primary_email(user)
end

它在我的应用程序中运行良好,但 cron 作业出错。

如果我将方法定义为:

def self.get_primary_email(user)
end

我的 cron 工作有效,但是通过浏览器调用 get_primary_email(user) 的每个方法都失败了。

我如何在这两个地方使用相同的方法?

编辑

日程安排.rb

set :output, "#{path}/log/cron.log"

every 1.day, :at => "8:00pm" do
  runner "BirthdayRemindersController.send_birthday_email_reminders"
end
4

2 回答 2

2

这通常通过设置 cron 作业来调用 rake 任务来完成。在 rake 任务中,您可以轻松调用 Rails 代码。

网上有很多例子。这是来自SO的一个:

rails 的 cron 工作:最佳实践?

编辑——添加 Resqueue 代码和 Mailer 示例

用户.rb

class User

  scope :birthday_today, lambda { where('birthday = ?', Date.today) }

  def self.send_birthday_alerts
    self.birthday_today.each do |user|
      BirthdayAlertJob.enqueue(user.id)
    end
  end

  def get_primary_email
    ...
  end

end

工作/birthday_alert_job.rb

class BirthdayAlertJob
  @queue = :birthday_alert

  def self.perform(u_id)
    user = User.find(u_id)
    UserMailer.birthday_alert(@user).deliver
  end
end

日程安排.rb

every 1.day, :at => "8:00pm" do
  rake "users:send_birthday_alerts"
end

用户.rake

namespace :users do
  desc "Queue up Birthday Alerts"
  task :send_birthday_alerts => :environment do
    User.send_birthday_alerts
  end
end

user_mailer.rb

class UserMailer < ActionMailer::Base

  def birthday_alert(user)
    mail(to: user.primary_email, subject: "Happy Birthday")
    ...
  end
end

这很接近,未经测试等。我知道您需要做的一件事是确保尚未向用户发送电子邮件。不知道你现在是怎么做的。另一列可以保存警报最后一次排队的时间。

于 2013-01-15T00:42:55.170 回答
1

根据您发布的内容,我建议您这样做:

lib/birthday_reminders.rb:

class BirthdayReminders
  def self.send_birthday_email_reminders
    # code ...
  end

  def self.primary_email_for(user)
    # code ...
  end
end

控制器/application_controller.rb:

class ApplicationController < ActionController::Base
  def get_primary_email(user)
    BirthdayReminders.primary_email_for(user)
  end
end

某处/schedule.rb:

set :output, "#{path}/log/cron.log"

every 1.day, :at => "8:00pm" do
  runner "BirthdayReminders.send_birthday_email_reminders"
end
于 2013-01-15T19:48:12.753 回答