【问题标题】:Sidekiq: ArgumentError: When assigning attributes, you must pass a hash as an argumentSidekiq:ArgumentError:分配属性时,必须将哈希作为参数传递
【发布时间】:2015-12-21 04:51:25
【问题描述】:

我猜this question 在 Rails 4 中很常见,但我的情况不同。

我正在使用 Sidekiq 来延迟创建工作;认为这是可能的,因为使用简单的数据,它是有效的。通过简单的数据:

def perform
 Foo.create(bar: "staff")
end

这是我有问题的数据:

supports_controller.rb:

def create
 params = support_params // seems to be issues here?
 DelayedJobs.perform_in(1.minutes, current_user.id, params)
 ...
end

private

  def support_params
   params.require(:support).permit(:foo1, :foo2, :foo3)
  end

app/workers/delayed_jobs.rb:

class DelayedJobs
  include Sidekiq::Worker
  def perform(user_id, params)
    u = User.find(user_id)
    support = u.supports.build(params)
    Support.create(support) // create and save to db
  end
end

通过网络(localhost:3000/sidekiq/scheduled,我看到了详细信息。很好。但是一分钟后它会因错误而重试。对此有帮助吗?

编辑:

在 sidekiq 网络参数中:

40, {"foo1"=>"a", "foo2"=>"b", "foo3"=>"c"}

为什么user_id(40)在外面?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 sidekiq


    【解决方案1】:

    问题不在于 Sidekiq;这是这一行的 ActiveRecord 问题:

    Support.create(support)

    create 只接受一个哈希,但你给它一个 Support

    这应该可行:

    class DelayedJobs
      include Sidekiq::Worker
      def perform(user_id, params)
        u = User.find(user_id)
        u.supports.create!(params) # `create!` will raise an error if the save fails; allowing you to catch invalid params
      end
    end
    

    Protip:您可以通过在 Rails 控制台中运行 perform 方法的主体来消除 Sidekiq 的嫌疑。即使不涉及 Sidekiq,您也会看到同样的错误。

    【讨论】:

      【解决方案2】:

      我建议你在 support 对象上调用 save 方法,因为当你使用 build 方法时,它会返回一个新的 support 实例,所以你只需要保存它。

      class DelayedJobs
      include Sidekiq::Worker
        def perform(user_id, params)
          u = User.find(user_id)
          support = u.supports.build(params)
          support.save // save to db
        end
      end 
      

      在您的控制器中尝试将参数更改为:

      def create
        params = params[:support]
      

      【讨论】:

      • 能否请您发布您当前遇到的错误消息?
      • 这些是传递给工作人员的参数,我的意思是你得到的错误堆栈是什么,你可以检查你的 sidekiq 控制台看看有什么错误:)
      • 恐怕错误如标题所示。没有其他可以发布的。
      • 检查我对控制器更改的更新答案,以回答为什么 40(用户 ID)在哈希之外,因为这些代表您的工作人员执行方法的参数(用户 ID,参数)
      • 感谢您的支持,marouenB。 Kitkat 的 create 成功了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多