Ruby 3.0.1环境下paypal-checkout-sdk出现URI.escape未定义错误如何解决
报错原因
Ruby 3.0+ 版本已正式移除废弃已久的 URI.escape 方法,而你当前使用的 paypalhttp v1.0.0 版本仍在调用该方法做参数编码,因此触发 NoMethodError 报错。
临时解决方案
无需降级Ruby版本,也不用等PayPal官方更新gem,可通过以下两种方式解决:
- 方案1:添加全局补丁(更推荐,不会因为重新安装gem失效)
在Rails项目的config/initializers目录下新建uri_escape_patch.rb文件,写入如下代码:
# 兼容Ruby3+ 补回URI.escape方法 unless URI.respond_to?(:escape) def URI.escape(str, unsafe = URI::UNSAFE) URI.encode_www_form_component(str).gsub('+', '%20') end end
添加后重启Rails服务即可生效,该补丁逻辑和原URI.escape行为一致,不会影响其他业务逻辑。
- 方案2:直接修改gem源码
找到报错提示的paypalhttp-1.0.0/lib/paypalhttp/serializers/form_encoded.rb文件,将第8行的URI.escape替换为URI.encode_www_form_component,修改后代码如下:
encoded_params.push("#{URI.encode_www_form_component(k.to_s)}=#{URI.encode_www_form_component(v.to_s)}")
该方案缺点是后续重新执行bundle install更新/重装gem后,修改会被覆盖,需要重新操作。
后续建议
等PayPal官方发布兼容Ruby3的paypalhttp版本后,升级gem再删除上述补丁即可,不会产生兼容冲突。
内容的提问来源于stack exchange,提问作者kev
相关产品推荐
相关产品推荐

