我正在尝试使用Whenever插件for rails在特定时间执行模型过程。我的schedule.rb如下:
every 1.day, :at => '5:30 am' do
runner "User.mail_out"
end
我的模型如下:
class User < ActiveRecord::Base
acts_as_authentic
def mail_out
weekday = Date.today.strftime('%A').downcase
@users = find(:conditions => "#{weekday}sub = t")
@users.each { |u| UserMailer.deliver_mail_out(u)}
end
end
当我尝试运行脚本/ runner -e开发“User.mail_out”命令时,我收到以下错误:
/var/lib/gems/1.8/gems/rails-2.3.5/lib/commands/runner.rb:48: undefined method `mail_out' for #<Class:0xb708bd50> (NoMethodError)
from (eval):1
from /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `eval'
from /var/lib/gems/1.8/gems/rails-2.3.5/lib/commands/runner.rb:48
from /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
from /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require'
from script/runner:3
有谁可以指出出了什么问题?另外,我如何手动调用mail_out进程(从命令行)来测试我的邮件系统的功能。
谢谢!
答案 0 :(得分:3)
您收到该错误是因为您已将mail_out
方法定义为实例方法而非类方法。要解决此问题,请将方法定义行更改为(添加self.
):
def self.mail_out
要从命令行进行测试,请执行以下操作:
script/runner "User.mail_out"
您可能需要puts
或print
某些内容,以便对所发生的事情获得一些反馈。
答案 1 :(得分:0)
我得到了与OP相同的错误,除了我确实正确定义了Class方法(或者我认为)。
事实证明,我将方法放在Controller(看起来像是正确的位置)而不是模型(看起来像错误的地方)。无论如何,把方法放在模型中为我解决了这个问题。