You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shopify应用添加RecurringApplicationCharge时遇NoMethodError错误求助

解决Shopify应用中@tokens为nil的NoMethodError问题

你碰到的这个错误其实很好理解——@tokens这个实例变量压根没被初始化就直接用来赋值了。在Ruby里,所有未主动初始化的实例变量默认都是nil,而nil对象根本没有[]=这个哈希赋值方法,所以才会抛出undefined method []=' for nil:NilClass的错误。

再看你的代码逻辑,其实这行@tokens[:confirmation_url] = ...完全是多余的:你在生成完recurring_charge之后,马上就调用redirect recurring_charge.confirmation_url跳转到确认页面了,根本不需要把这个URL存在@tokens里。

不过如果你确实有保留@tokens的需求(比如后续要用到这个值),可以按下面两种方式处理:

方案1:初始化@tokens为哈希

在赋值之前,先把@tokens初始化为一个空哈希,这样就能正常使用哈希赋值了:

# 在赋值代码前添加初始化语句
@tokens = {}
@tokens[:confirmation_url] = recurring_charge.confirmation_url

方案2:直接删除冗余代码(更推荐)

既然你马上就要重定向到确认URL,完全可以删掉@tokens相关的所有代码,简化后的控制器动作如下:

def charging
  if @shop_domain != @myshop
    @shop_charging_status = @shop.charging
    unless ShopifyAPI::RecurringApplicationCharge.current
      recurring_charge = ShopifyAPI::RecurringApplicationCharge.new(
        name: "My App",
        price: "1.99",
        return_url: "https://appurl/activated",
        trial_days: 7,
        terms: "$1.99 per month"
      )
      if recurring_charge.save
        @shop_charging_status = true
        @shop.save
        redirect recurring_charge.confirmation_url
      end
    end
  else
    redirect_to myindex_path
  end
end

最后给你提个小建议:可以再检查下@shop.charging这个属性的更新逻辑,确保创建订阅后标记店铺的收费状态是符合你业务需求的;另外ShopifyAPI::RecurringApplicationCharge.current的判断很合理,能避免重复创建订阅请求,这部分没问题。

内容的提问来源于stack exchange,提问作者Spinshot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 11:32:49