2011-05-30 90 views
1

我有一份工作(计划由delayed_job),当新用户注册到应用程序时发送电子邮件。这是用户模式:奇怪的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 

负责注册新用户的操作是:

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 

当用户登记,我得到以下日志:

开始POST“/ wrap_users“为 ...于2011-05-30 12:58:35 +0200处理WrapUsersController#创建为HTML

参数 {“email”=>“xxxx”, “password”=>“[FILTERED]”, “password_confirmation”=>“[FILTERED]”, “phone_number”=>“xxx”, “ opt_in “=>” 真”, “国家”=> “法国”}

AREL(0.3ms的)INSERT INTO “delayed_jobs”( “优先级”, “尝试”, “处理程序”, “last_error”, “run_at”, “locked_at”, “failed_at”, “locked_by”, “created_at”, “的updated_at”)VALUES(0,0,“--- 红宝石/ ActiveRecord的:用户属性:
电子邮件: xxxx encrypted_pa​​ssword: $ 2A $ 10 $ DwHB/5zSp38xdAAIkYriSuwIiLyKy2geU5kLmzjz2f1WsAuxpqyIW reset_password_token:
reset_password_sent_at:
remember_created_at:sign_in_count: 0 current_sign_in_at:
last_sign_in_at:current_sign_in_ip: last_sign_in_ip:created_at:
的updated_at:国家:法国opt_in: 真正PHONE_NUMBER:XXX ', NULL,'2011-05-30 10:58:35.250464', NULL,NULL,NULL,'2011-05-30 10:58:35.250560','2011-05-30 10:58: 35.250560')AREL(2.1ms)

INSERT INTO “用户”( “电子邮件”, “encrypted_pa​​ssword”, “reset_password_token”, “reset_password_sent_at”, “remember_created_at”, “sign_in_count”, “current_sign_in_at”, “last_sign_in_at”, “current_sign_in_ip” , “last_sign_in_ip”, “created_at”, “的updated_at”, “国家”, “opt_in”, “PHONE_NUMBER”)值 ( 'XXX', '$ 2A $ 10 $ DwHB/5zSp38xdAAIkYriSuwIiLyKy2geU5kLmzjz2f1WsAuxpqyIW', NULL,NULL ,NULL,0,NULL,NULL,NULL, NULL,'2011-05-30 10:58:35.251788', '2011-05-30 10:58:3 5.251788' , '法国', 'T', 'XXX') 重定向到 http://...:3000/wrap_users 完成302实测值在277ms

正如你可以看到,根据日志的条目被记录到Delayed::Job表。但事实上,当计算此表中的记录数时(在相同开发模式下的rails console),我得到0。

这是怎么回事?日志没有提及有关insert into delayed_jobs步骤的任何问题。

感谢

回答

3

表可能是空的,因为工人接受了这份工作离开那里,并删除了它。 作为一个方面说明,我会使用after_create回调代替电子邮件=调度作业。至少由于一个原因 - 即使验证失败,您仍然会发送电子邮件。

+0

那么这就是为什么它很奇怪。我正在运行的工人没有处理这项工作!所以没有理由将这项工作删除。 – 2011-05-30 16:03:28

+0

所以显然你是对的!它无论如何处理它们:) – 2011-05-30 18:45:29

+0

我仍然强烈建议使用回调或观察者的方法,而不是重写setter。 – Roman 2011-05-31 08:15:31