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
相关产品推荐
相关产品推荐

