【问题标题】:deliver_later using sidekiq railsDeliver_later 使用 sidekiq rails
【发布时间】:2016-11-18 17:35:08
【问题描述】:

我尝试使用 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'

【问题讨论】:

    标签: ruby-on-rails sidekiq


    【解决方案1】:

    我猜你是按照《ruby on rails tutorial》这本书,如果我们用deliver_now运行代码,结果会正确,但是如果我们用deliver_later运行代码,就会显示错误顶部。 阅读活动工作指南后,我知道活动工作使用 GlobalID,这使得将实时 Active Record 对象传递给您的工作而不是类/ID 对成为可能。

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

    class User < ApplicationRecord
      attr_accessor :activation_token
    end
    

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

    1. 保留activation_token 属性或
    2. 单独传输activation_token属性
    class UserMailer < ApplicationMailer
      def account_activation(user, activation_token)
        @user = user
        @activation_token = activation_token
        mail to: user.email, subject: "user activation"
      end
    end
    
    UserMailer.account_activation(user, user.activation_token).deliver_later
    
    <p><%= link_to "active link", edit_account_activation_url(@activation_token, email: @user.email) %></p>
    

    【讨论】:

      【解决方案2】:

      这是错误

      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} 缺少必需的键:[:id]

      您的邮件视图出错了。在某个地方你有这样的东西

      edit_account_activation_path(@activation)
      

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

      【讨论】:

        【解决方案3】:

        邮件视图有错误。 您需要检查以 nil 形式传递的 @activation 对象。

        【讨论】:

          【解决方案4】:

          如果您正在使用 sidekiq,请不要稍后使用 Deliver,因为该作业永远不会执行,而是使用 perform_in() 并使用内部的方法 deliver_now 调用工作人员

          【讨论】:

          猜你喜欢
          • 2018-07-15
          • 2015-08-02
          • 2016-02-15
          • 2018-09-05
          • 1970-01-01
          • 2015-03-09
          • 2020-01-06
          • 2018-04-11
          • 2014-10-16
          相关资源
          最近更新 更多