1

私のアプリでは、ユーザーがホームページにアクセスし、賭けの名前 (楽しみのために)、電子メール アドレス、リマインダーを希望する日付、および賭けに関する詳細を入力します。これを 1 日 1 回実行するために、everyone ジェムを使用しています。

bet.rb

class Bet < ActiveRecord::Base
  attr_accessible :details, :email, :name, :reminder, :sent

  # Sends user a reminder if current_date is equal to the reminder date of the bet
  def check_bet
    current_date = Time.now.strftime("%Y-%m-%d").to_s
    @bets = Bet.all
    @bets.each do |bet|
    BetMailer.bet_reminder(bet).deliver and bet.sent = true and bet.save! if bet.reminder.to_s == current_date
    end 
  end
end

スケジュール.rb

every :day, :at => '5:00pm' do
  runner "Bet.check_bet"
end 

bet_mailer.rb

class BetMailer < ActionMailer::Base
  default from: "from@example.com"

  def bet_reminder(bet)
    @bet = bet

    mail to: bet.email, subject: bet.name + " Reminder"
  end
end

current_date がリマインダーを受け取りたい日付と等しいときにメールを送信することに成功しました (リマインダー)。これをテストするために、Rails コンソールに移動し、特定の Bet オブジェクトを選択して、次を使用して check_bet メソッドを実行しました。

1.9.2p320 :013 > Bet.last.check_bet
  Bet Load (2.8ms)  SELECT "bets".* FROM "bets" ORDER BY "bets"."id" DESC LIMIT 1
  Bet Load (0.9ms)  SELECT "bets".* FROM "bets" 
   (0.2ms)  BEGIN
   (0.3ms)  COMMIT
   (0.2ms)  BEGIN
   (0.3ms)  COMMIT
   (0.2ms)  BEGIN
   (0.2ms)  COMMIT
 => [#<Bet id: 3, name: "Newsroom", email: "email@email.com", reminder: "2013-07-30", details: "Mac and Will are going to get back together.", sent: false, created_at: "2013-07-29 17:23:13", updated_at: "2013-07-29 17:23:13">, #<Bet id: 4, name: "Testing", email: "email@email.com", reminder: "2013-07-29", details: "This is a test", sent: true, created_at: "2013-07-29 18:38:42", updated_at: "2013-07-29 20:17:34">, #<Bet id: 5, name: "Cheaper iPhone", email: "email@email.com", reminder: "2013-07-29", details: "I bet Dad that there will be a cheaper iphone in th...", sent: true, created_at: "2013-07-29 20:39:33", updated_at: "2013-07-29 20:50:14">, #<Bet id: 6, name: "My grades", email: "email@email.com", reminder: "2013-07-29", details: "My grades this year will be > 84% average", sent: true, created_at: "2013-07-29 20:56:18", updated_at: "2013-07-29 21:14:21">] 

端末が上記の処理を完了すると、メール ボックスは、reminder = current_date を持つすべての Bet オブジェクトでいっぱいになります。これは、SMTP 設定が機能していることを証明しており、私のビューのコードは正常に機能しています。

ただし、すべてのベット オブジェクトで check_bet メソッドを実行しようとすると、未定義のメソッド エラーが発生します。

1.9.2p320 :016 > Bet.all.check_bet
  Bet Load (1.8ms)  SELECT "bets".* FROM "bets" 
NoMethodError: undefined method `check_bet' for #<Array:0x007ffdd2c8c6c0>
    from (irb):16
    from /Users/bvlaar/.rvm/gems/ruby-1.9.2-p320@rails3tutorial/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start'
    from /Users/bvlaar/.rvm/gems/ruby-1.9.2-p320@rails3tutorial/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start'
    from /Users/bvlaar/.rvm/gems/ruby-1.9.2-p320@rails3tutorial/gems/railties-3.2.13/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>

'

さらに、ターミナルで「bundle exec when」コマンドを実行すると、何も送信されないようです。

4

2 に答える 2