开发者

Weird delayed_job behaviour

I have a job (scheduled by delayed_job) that sends an email when a new user registers to the application. This is the user model:

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

The action responsible for registering a new user is:

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开发者_StackOverflow中文版[:phone_number]})

      if user.save(:validate => false)
        redirect_to wrap_users_path
      end 
end

When a user registers I get the following log:

Started POST "/wrap_users" for ... at 2011-05-30 12:58:35 +0200 Processing by WrapUsersController#create as HTML

Parameters: {"email"=>"xxxx", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "phone_number"=>"xxx", "opt_in"=>"true", "country"=>"France"}

AREL (0.3ms) INSERT INTO "delayed_jobs" ("priority", "attempts", "handler", "last_error", "run_at", "locked_at", "failed_at", "locked_by", "created_at", "updated_at") VALUES (0, 0, '--- !ruby/ActiveRecord:User attributes:

email: xxxx encrypted_password: $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: country: France opt_in: true 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 "users" ("email", "encrypted_password", "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", "country", "opt_in", "phone_number") VALUES ('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:35.251788', 'France', 't', 'xxx') Redirected to http://...:3000/wrap_users Completed 302 Found in 277ms

As you can see, according to the Log an entry is being recorded to the Delayed::Job table. But in fact, when counting the number for records in this table (on rails console in the same development mode) I get 0.

What is going on? The log didn't mention any issue regarding the insert into delayed_jobs step.

Thanks


The table is empty probably because a worker took the job out of there and deleted it. As a side note, I would use after_create callback instead of email= for scheduling a job. At least for one reason - even if the validation fails, you'll send the email anyway.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜