Ruby on rails 3 奇怪的工作行为
我有一个作业(由Ruby on rails 3 奇怪的工作行为,ruby-on-rails-3,actionmailer,delayed-job,Ruby On Rails 3,Actionmailer,Delayed Job,我有一个作业(由delayed_job安排),当新用户注册到应用程序时,它会发送电子邮件。这是用户模型: class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable attr_accessible :email, :password, :password_c
delayed_job
安排),当新用户注册到应用程序时,它会发送电子邮件。这是用户模型:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
attr_accessible :email, :password, :password_confirmation, :remember_me, :country, :phone_number, :opt_in
def email=(email)
super
Delayed::Job.enqueue self
end
def perform
begin
UserMailer.welcome_email self
rescue => e
STDERR.puts "Cannot perform the mailer: #{e}"
end
end
end
当用户注册时,我会得到以下日志:
已为启动POST“/wrap\u用户”
... 2011-05-30 12:58:35+0200 WrapuserController处理#创建为HTML
参数:
{“email”=>“xxxx”,
“密码”=>“[已筛选]”,
“密码确认”=>“[已筛选]”,
“电话号码”=>“xxx”,
“选择加入”=>“真实”、“国家”=>“法国”}
AREL(0.3ms)插入到
“延迟工作”(“优先级”),
“尝试”、“处理程序”、“最后一个错误”,
“运行时间”、“锁定时间”、“失败时间”,
“锁定者”、“创建者”,
“更新的”值(0,0,'---
!ruby/ActiveRecord:用户属性:电邮:xxxx 加密密码: $2a$10$DwHB/5ZSP38XDAIKYRISUWIIKY2GEU5KLMZJZ2F1WSAUXPQYIW 重置密码\u令牌:
重置密码发送地址:
请记住在以下位置创建:在计数中签名: 0当前登录地址:
上次登录地址:当前登录ip: 最后一次登录ip:创建地址:
更新地址:国家:法国选择加入: 真实电话号码:xxx', 空,“2011-05-30 10:58:35.250464”, 空,空,空,2011-05-30 10:58:35.250560', '2011-05-30 10:58:35.250560’)阿雷尔(2.1ms) 插入“用户”(“电子邮件”), “加密密码”, “重置密码\u令牌”, “重置密码发送地址”, “记住你在那里创造的”, “登录次数”、“当前登录时间”, “最后一次签名在”, “ip中的当前签名”, “ip中的最后一个签名”,“创建于”, “更新地点”、“国家”、“选择加入”, “电话号码”)值 (‘xxx’, “$2a$10$DwHB/5ZSP38XDAIKyrisuwiilyKy2GEU5KLMZJZ2F1WSAUXPQYIW”, 空,空,空,0,空,空,空, 空,“2011-05-30 10:58:35.251788”, '2011-05-30 10:58:35.251788', ‘法国’、‘t’、‘xxx’) 重定向到 277ms内完成302个 如您所见,根据日志,正在将一个条目记录到
Delayed::Job
表中。但事实上,当计算表中记录的数量时(在相同开发模式下的rails控制台上),我得到了0
发生了什么事?日志中没有提到有关插入延迟作业的步骤的任何问题
谢谢表是空的,可能是因为工作人员将作业从表中删除了。
作为旁注,我将使用after_create callback而不是email=来安排作业。至少有一个原因——即使验证失败,你还是会发送电子邮件。这就是为什么它很奇怪。我正在运行的工人没有处理作业!所以没有理由删除作业。我仍然强烈建议使用回调或观察方法,而不是重写setter。确实如此。我更改了它,我正在使用after_create now!:)
def create
user = User.new({:email => params[:email],
:password => params[:password],
:password_confirmation => params[:password_confirmation],
:country => params[:country],
:opt_in => Boolean(params[:opt_in]),
:phone_number => params[:phone_number]})
if user.save(:validate => false)
redirect_to wrap_users_path
end
end