使用sidekiq rails的deliver_later

时间:2016-11-18 17:35:08

标签: ruby-on-rails sidekiq

我尝试使用sidekiq来执行deliver_later,但是收到了错误消息。

这是我的设置

* execute redis
redis-server

* execute sidekiq
bundle exec sidekiq -q default -q mailers

* Gemfile
gem 'sidekiq'


* application.rb
config.active_job.queue_adapter = :sidekiq


#send email
 UserMailer.account_activation(@user).deliver_later

我不知道如何解决这个问题。 这是错误消息

50.345Z 41513 TID-oxh5ccnb8 ActionMailer::DeliveryJob JID-1c7ea4b33150d3805ff777aa INFO: start
2016-11-18T17:13:50.413Z 41513 TID-oxh5ccnb8 ActionMailer::DeliveryJob JID-1c7ea4b33150d3805ff777aa INFO: fail: 0.068 sec
2016-11-18T17:13:50.414Z 41513 TID-oxh5ccnb8 WARN: {"context":"Job raised exception","job":{"class":"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper","wrapped":"ActionMailer::DeliveryJob","queue":"mailers","args":[{"job_class":"ActionMailer::DeliveryJob","job_id":"c2ee4092-4e73-4e1f-857f-3e081594c735","queue_name":"mailers","priority":null,"arguments":["UserMailer","account_activation","deliver_now",{"_aj_globalid":"gid://academic-lib/User/8"}],"locale":"en"}],"retry":true,"jid":"1c7ea4b33150d3805ff777aa","created_at":1479489230.323255,"enqueued_at":1479489230.3232949,"error_message":"No route matches {:action=>\"edit\", :controller=>\"account_activations\", :email=>\"chandleryang76@gmail.com\", :id=>nil} missing required keys: [:id]","error_class":"ActionView::Template::Error","failed_at":1479489230.4132302,"retry_count":0},"jobstr":"{\"class\":\"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper\",\"wrapped\":\"ActionMailer::DeliveryJob\",\"queue\":\"mailers\",\"args\":[{\"job_class\":\"ActionMailer::DeliveryJob\",\"job_id\":\"c2ee4092-4e73-4e1f-857f-3e081594c735\",\"queue_name\":\"mailers\",\"priority\":null,\"arguments\":[\"UserMailer\",\"account_activation\",\"deliver_now\",{\"_aj_globalid\":\"gid://academic-lib/User/8\"}],\"locale\":\"en\"}],\"retry\":true,\"jid\":\"1c7ea4b33150d3805ff777aa\",\"created_at\":1479489230.323255,\"enqueued_at\":1479489230.3232949}"}
2016-11-18T17:13:50.414Z 41513 TID-oxh5ccnb8 WARN: ActionView::Template::Error: No route matches {:action=>"edit", :controller=>"account_activations", :email=>"chandleryang76@gmail.com", :id=>nil} missing required keys: [:id]
2016-11-18T17:13:50.414Z 41513 TID-oxh5ccnb8 WARN: /Users/chandler/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/journey/formatter.rb:50:in `generate'
/Users/chandler/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/routing/route_set.rb:629:in `generate'
/Users/chandler/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/routing/route_set.rb:660:in `generate'
/Users/chandler/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/routing/route_set.rb:707:in `url_for'

4 个答案:

答案 0 :(得分:0)

这是错误

  

2016-11-18T17:13:50.414Z 41513 TID-oxh5ccnb8警告:ActionView :: Template ::错误:没有路由匹配{:action =>" edit",:controller => " account_activations",:email =>" chandleryang76@gmail.com",:id => nil}缺少必需的密钥:[:id]

您的邮件程序视图错误输出。在那里你有类似的东西

edit_account_activation_path(@activation)

其中@activation为零。因此错误。没有对象,编辑路径无效。

答案 1 :(得分:0)

邮件程序视图中有错误。 你需要检查传递为nil的@activation对象。

答案 2 :(得分:0)

如果您正在使用sidekiq,请不要稍后再使用Delivery,因为该作业永远不会执行,而是使用perform_in(<>)并在内部使用方法delivery_now调用工作程序

答案 3 :(得分:0)

我猜您遵循了《 ruby​​ on rails教程》这本书,如果我们使用deliver_now运行代码,则结果会正确,但是如果我们使用deliver_later运行代码,则会显示错误顶部。 阅读了活动的工作指南后,我知道活动的工作使用GlobalID,这可以将活动的Active Record对象传递给您的工作,而不是将类/ id对传递给工作。

在《 ruby​​ on rails教程》一书中,属性activation_token是虚拟属性

json.parse()

活动作业使用用户对象作为参数,用户对象将作为例外发送,但虚拟属性将丢失,方法如下:

  
      
  1. 保留“ activation_token”属性或
  2.   
  3. 仅传输Activation_token属性
  4.   
class User < ApplicationRecord
  attr_accessor :activation_token
end
相关问题