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

これは多くの場合、rake タスクを呼び出す cron ジョブを設定することによって行われます。rake タスクでは、Rails コードを簡単に呼び出すことができます。

ウェブ上にはたくさんの例があります。ここにSOからの1つがあります:

Rails の cron ジョブ: ベスト プラクティス?

編集 -- Resqueue コードとメーラーの例を追加

user.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

jobs/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

users.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

これは近い、テストされていないなどです。あなたがしなければならないことがわかっていることの 1 つは、ユーザーがまだメールを送信されていないことを確認することです。あなたが今これをどのように行っているかわかりません。別の列には、アラートが最後にキューに入れられた時刻を保持できます。

于 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 に答える