首页 文章

Sidekiq:ArgumentError:分配属性时,必须传递散列作为参数

提问于
浏览
0

我猜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 /预定,我看到了详细信息 . 太棒了 . 但是过了一会儿它会重新出现错误 . 这个有什么帮助吗?

EDIT:

在sidekiq web参数中:

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

为什么 user_id (40)在外面?

2 回答

  • 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作为嫌疑人 . 你'll see that you get the same error even when Sidekiq isn'吨参与 .

  • 0

    我建议您在支持对象上调用save方法,因为当您使用构建方法时,它会返回一个新的支持实例,因此您只需要保存它 .

    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]
    

相关问题