我试图使用whenever
gem将cron作业运行到我的应用程序中。我想重新计算属性" value"我的模特"用户"每两分钟一次。以下是我采取的步骤:
的Gemfile
gem 'whenever', :require => false
终端
$ bundle install
$ wheneverize .
schedule.rb
every 2.minutes do
runner "User.recalculate"
end
模型/ user.rb
def self.recalculate
User.all.each {|user| user.recalculate_value }
end
private
def recalculate_value
self.value = self.value + 1
self.save!
end
终端
$ whenever --update-crontab
每当-l' 和' $返回此信息:
0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58 * * * * /bin/bash -l -c 'cd /home/website && bin/rails runner -e development '\''User:recalculate'\'''
但到目前为止,User.values
中没有任何变化。在我的控制台中运行User.recalculate
,所以错误显然是在Whenever中。我错过了什么?
答案 0 :(得分:4)
我很快创建了一个新的Rails应用程序来尝试重现您的问题,您可以在此处找到它,克隆它并亲自查看。
https://github.com/mlainez/stackoverflow-28111330/blob/master/app/models/user.rb
您要做的第一件事是验证运行器运行的环境。默认情况下,只要使用production
。如果您在本地计算机上,请务必在schedule.rb中将其设置为development
,或查看文档以了解如何更新crontab并设置正确的环境。
https://github.com/mlainez/stackoverflow-28111330/blob/master/config/schedule.rb#L7
这是您应该在crontab中看到的内容:
0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58 * * * * /bin/bash -l -c 'cd /Users/marc/Projects/stack && bin/rails runner -e development '\''User.recalculate'\'''
注意它是rails runner -e development
而不是production
。
另一件事是巴西亚是对的。当我离开private
关键字并尝试在User.recalculate
中执行rails c
时,它会失败并显示:
private method `recalculate_value' called for #<User ...>
我很惊讶它与您控制台中的private关键字一起使用...您正在尝试访问实例上的私有方法。这在Ruby中是不可能的。您只能从外部访问实例的公共方法(除非您使用send(:method)
)。
删除private关键字修复它,任务每两分钟按预期运行。
我在我的github代码中使用了Rails 4.2.0和ruby 2.1.0。
修改强>
确保您的cron守护程序正在运行:
service cron status
我还注意到在你的crontab输出中你有:
bin/rails runner -e development '\''User:recalculate'\''
请注意:
和User
之间的recalculate
。你必须在你的schedule.rb
它应该是.
,因为它是方法调用。
此外,您可能想检查whenever -l
和crontab -l
的输出是否相同。如果crontab -l
不同或为空,那么您没有正确使用whenever --update-crontab
或whenever -w
,或者您正在使用的版本可能出现问题。
答案 1 :(得分:1)
删除private
,因为现在正在运行的User.recalculate
将失败并显示private method 'increment' called for #<User>
错误。
increment
http://apidock.com/rails/ActiveRecord/Base/increment方法和increment!
(保存记录),因此最好将方法名称更改为其他名称,或者只使用user.increment!(:value)
。
答案 2 :(得分:0)
您似乎无法将您的用户保存在方法increment
中。试试这个:
def increment
self.value = self.value + 1
self.save
end