在Rails中迭代JSON数组的方法及Shopify API订单遍历异常排查
解决Rails中Shopify订单JSON遍历的问题
看起来你离解决问题只差一步!我先帮你排查最可能的问题,再给你几个实用的优化建议:
1. 修复JSON解析的核心问题
你现在直接对RestClient.get返回的对象做JSON.parse,但其实RestClient返回的是RestClient::Response对象,不是纯JSON字符串。你需要先获取它的body属性再解析:
# 控制器里修正后的代码 @ordersfetch = RestClient.get("https://#{ENV['SHOPIFY_API_KEY']}:#{ENV['SHOPIFY_API_PASSWORD']}@website.myshopify.com/admin/api/2020-10/orders.json") @orders = JSON.parse(@ordersfetch.body) # 关键:加上.body!
这应该是导致你视图遍历失败的主要原因——之前解析的是响应对象本身,而不是实际的JSON数据,所以@orders['orders']很可能是nil,自然无法执行遍历操作。
2. 验证数据结构是否符合预期
在视图里可以临时添加调试代码,确认数据结构是否正确:
<%= debug @orders %>
这会把@orders的完整结构以格式化的方式输出,你可以直观确认是否真的存在'orders'键,以及它的值是不是预期的数组格式。
3. 用更安全的方式避免遍历报错
即使数据结构正确,也建议用更健壮的写法,防止API返回异常时视图崩溃:
<% (@orders.dig('orders') || []).each do |order| %> <p>订单ID: <%= order['id'] %></p> <p>客户邮箱: <%= order['email'].presence || '未提供' %></p> <!-- 其他需要展示的订单字段 --> <% end %>
dig('orders')会安全地获取嵌套键,如果键不存在就返回nil,搭配|| []可以确保即使没有订单数据,也不会抛出undefined method 'each' for nil:NilClass的错误。
4. 增加异常处理(可选但推荐)
Shopify API请求可能因为权限、网络波动等问题失败,建议在控制器里添加异常处理,避免整个页面崩溃:
begin @ordersfetch = RestClient.get("https://#{ENV['SHOPIFY_API_KEY']}:#{ENV['SHOPIFY_API_PASSWORD']}@website.myshopify.com/admin/api/2020-10/orders.json") @orders = JSON.parse(@ordersfetch.body) rescue RestClient::ExceptionWithResponse => e Rails.logger.error "Shopify API 请求失败: #{e.response.body}" @orders = { 'orders' => [] } # 给默认空数组,保证视图正常渲染 rescue JSON::ParserError => e Rails.logger.error "JSON解析失败: #{e.message}" @orders = { 'orders' => [] } end
按照上面的步骤调整后,应该就能正常遍历并显示每个订单了!
内容的提问来源于stack exchange,提问作者Gibson
相关产品推荐
相关产品推荐

