在用户选择的日期发送电子邮件 [英] Sending emails on user-selected dates

查看:39
本文介绍了在用户选择的日期发送电子邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用涉及到人们进入主页,输入他们下注的名称(为了好玩)、他们的电子邮件地址、他们希望收到提醒的日期以及一些有关下注的详细信息.我正在使用每当 gem 每天运行一次.

My app involves people coming to a home page, entering a name of a bet they've made (for fun), their email address, a date they would like to be reminded, and some details about the bet. I am using the whenever gem to have this run once a day.

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

schedule.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 方法:

I have been successful in having emails sent when the current_date is equal to the date they wanted to be reminded on (reminder). To test this, I've gone into the rails console, and selected a particular Bet object, and ran the check_bet method on it using:

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">] 

终端完成上述操作后,我的邮箱里就装满了所有的 Bet 对象,它们的提醒 = current_date.这证明 SMTP 设置工作正常,并且我视图中的代码工作正常.

After the terminal completes the above, my email box is full of all of the Bet objects that have their reminder = current_date. This proves the SMTP settings are working, and the code in my views is working fine.

但是,当我尝试在所有投注对象上运行 check_bet 方法时,我收到一个未定义的方法错误:

However, when I try running the check_bet method on all of the bet objects, I receive an undefined method error:

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 Every"命令时,似乎没有发送任何内容.

In addition, when I run the 'bundle exec whenever' command in terminal, nothing seems to get sent.

推荐答案

Bet.all 返回一个 Arraycheck_bet 方法用于该数组没有定义.要在 Bet 的每个实例上调用 check_bet,您需要执行 Bet.all.each {|bet|bet.check_bet} 或更简洁的 Bet.all.each(&:check_bet)(向 @Ryan Bigg 致敬).

Bet.all returns an Array, for which the check_bet method is not defined. To invoke check_bet on each instance of Bet, you need to do Bet.all.each {|bet| bet.check_bet} or the cleaner Bet.all.each(&:check_bet) (with nod to @Ryan Bigg).

另见 http://guides.rubyonrails.org/active_record_querying.html#retrieving-multiple-objects-in-batches,出于某些性能考虑.

See also http://guides.rubyonrails.org/active_record_querying.html#retrieving-multiple-objects-in-batches, for some performance considerations.

这篇关于在用户选择的日期发送电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆