我在Ruby 2.0上使用Ruby on Rails 4并在我的app目录中使用redis-server
和bundle exec sidekiq
在本地运行redis-server和sidekiq 2.17.7。我想使用像这样的sidekiq延迟发送电子邮件:
UserMailer.delay.signup_notification(@user.id, @user.email, activate_url, @user.activation_token, root_url)
signup_notification
内的UserMailer
操作是这样的:
def signup_notification(user_id, user_email, activate_url, activation_token, root_url)
return if Rails.env.test?
@user = User.find(user_id)
if @user.email.downcase == user_email.downcase
@activate_url = activate_url
@activation_token = activation_token
@root_url = root_url
mail :to => @user.email, :subject => "Welcome to #{t('product.name')} by AppName"
else
logger.warn "[#{self.class.name}##{__method__}] told to send email to user(id: #{user_id}, email: #{user_email}), but actual user is: #{@user.inspect}"
end
end
我在sidekiq中遇到一个错误:
WARN: {"retry"=>true, "queue"=>"default", "class"=>"Sidekiq::Extensions::DelayedMailer", "args"=>["---\n- !ruby/class 'UserMailer'\n- :signup_notification\n- - 6cI7bbeTKXCEROwf1qxdkE\n - user@test.com\n - http://0.0.0.0:3003/activate\n - 76-hibLYSPlcRiN9BTxt_g\n - http://0.0.0.0:3003/\n"], "jid"=>"c2413ca2c2597af07eb6146c", "enqueued_at"=>1395351890.0875876, "error_message"=>"undefined method `email' for nil:NilClass", "error_class"=>"NoMethodError", "failed_at"=>"2014-03-20T21:44:51Z", "retry_count"=>6, "retried_at"=>1395353704.7546926}
WARN: undefined method `email' for nil:NilClass
WARN: /home/jchan/projects/MyRailsProject/app/mailers/user_mailer.rb:24:in `signup_notification'
user_mailer.rb
中的第24行距离上面的代码if @user.email.downcase == user_email.downcase
。
我确定@user.id
以及我传入的其他所有内容都不是nil
,如果我不使用.delay
(并附加),一切都会完美无缺当然.deliver
到UserMailer.signup_notification
来电。
好像值没有正确传递。我做错了什么?