首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Ruby2.7更新到Ruby3.0.1后的ArgumentError

从Ruby2.7更新到Ruby3.0.1后的ArgumentError
EN

Stack Overflow用户
提问于 2021-07-20 04:59:29
回答 1查看 2.1K关注 0票数 1

在将ruby更新为3.0.1之后,非常简单的代码无法执行app_uninstalled_job.rb

代码语言:javascript
运行
复制
class AppUninstalledJob < ActiveJob::Base
  def perform(shop_domain:, webhook:)
    shop = Shop.find_by(shopify_domain: shop_domain)

有错误

代码语言:javascript
运行
复制
Error performing AppUninstalledJob (Job ID: ***) from Async(default) in 0.18ms: ArgumentError (wrong number of arguments (given 1, expected 0; required keywords: shop_domain, webhook)):
.../app/jobs/app_uninstalled_job.rb:2:in `perform'

数据正确接收

代码语言:javascript
运行
复制
Started POST "/webhooks/app_uninstalled" for 34.69.74.99 at 2021-07-20 04:44:31 +0000
Processing by ShopifyApp::WebhooksController#receive as */*
  Parameters: {"id"=>876876876, "name"=>"shopname", "email"=>"***@gmail.com", "domain"=>"shop.myshopify.com", "province"=>.....}}
[ActiveJob] Enqueued AppUninstalledJob (Job ID: ) to Async(default) with arguments: {:shop_domain=>"shop.myshopify.com", :webhook=>{"id"=>876876876, "name"=>"shop", "email"=>"***@gmail.com", "domain"=>"shop.myshopify.com", "province"=>....}


[ActiveJob] [AppUninstalledJob] [****9] Performing AppUninstalledJob (Job ID: **99) from Async(default) enqueued at 2021-07-20T04:44:31Z with arguments: {:shop_domain=>"shop.myshopify.com", :webhook=>{"id"=>876876876, "name"=>"shop", "email"=>"***@gmail.com", "domain"=>"shop.myshopify.com", "province"....}
Completed 200 OK in 6ms (ActiveRecord: 0.0ms | Allocations: 2327)

它与处理参数委托https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/有关。

如何解决错误ArgumentError (给定错误的参数数(给定1,预期为0;所需关键字: shop_domain,web钩子)

更新:web钩子控制器的代码

代码语言:javascript
运行
复制
module ShopifyApp
  class MissingWebhookJobError < StandardError; end

  class WebhooksController < ActionController::Base
    include ShopifyApp::WebhookVerification

    def receive
      params.permit!
      job_args = { shop_domain: shop_domain, webhook: webhook_params.to_h }
      webhook_job_klass.perform_later(job_args)
      head(:ok)
    end

    private

    def webhook_params
      params.except(:controller, :action, :type)
    end

    def webhook_job_klass
      webhook_job_klass_name.safe_constantize || raise(ShopifyApp::MissingWebhookJobError)
    end

    def webhook_job_klass_name(type = webhook_type)
      [webhook_namespace, "#{type}_job"].compact.join('/').classify
    end

    def webhook_type
      params[:type]
    end

    def webhook_namespace
      ShopifyApp.configuration.webhook_jobs_namespace
    end
  end
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-20 06:17:09

由于您已经共享了Ruby 3中更改的链接,答案在于链接本身:

Ruby3.0中位置和关键字参数的

分离:在大多数情况下,可以通过添加double splat运算符来避免不兼容性。它显式指定传递关键字参数,而不是哈希对象。同样,可以添加大括号{}以显式传递哈希对象,而不是关键字参数。

现在看看您的代码,您正在执行以下操作:

代码语言:javascript
运行
复制
job_args = { shop_domain: shop_domain, webhook: webhook_params.to_h }
webhook_job_klass.perform_later(job_args)

例如,将散列传递给该方法,而是传递关键字参数,可以通过添加一个double splat运算符来修复这些参数:

代码语言:javascript
运行
复制
webhook_job_klass.perform_later(**job_args)

有关错误的更多信息:

错误是:

代码语言:javascript
运行
复制
ArgumentError (wrong number of arguments (given 1, expected 0; required keywords: shop_domain, webhook)):

这意味着shop_domainwebhook是必需的关键字参数,并且您要传递一个参数,因为Ruby现在将哈希作为单个参数来处理,而不是关键字参数,直到您添加了double splat运算符。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68449752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档