Rails中HTTP哈希数组调用item_id触发NoMethodError问题求助
问题解决:HTTP返回哈希数组转Rails可处理格式
问题根源
你拿到的@line_item里的元素是Ruby哈希(Hash),不是ActiveRecord模型实例,所以不能用.调用属性(比如i.item_id),哈希需要用键取值的方式访问。
解决方案
有两种常用处理方式:
方式1:直接使用哈希键取值
修改循环里的取值逻辑,把点语法换成哈希键访问:
@not_available_items = [] @line_item = @order.line_item @line_item.each do |i| @item = Item.find(i["item_id"]) if !@item.is_active @not_available_items.push( { item_id: i["item_id"], item_name: i["item_name"] } ) end end
方式2:转换为支持点语法的对象
如果习惯用点语法,可以把哈希转换成Rails内置的ActiveSupport::HashWithIndifferentAccess,或者Ruby标准库的OpenStruct:
@not_available_items = [] @line_item = @order.line_item @line_item.each do |i| # 转换为支持点语法的对象 item_hash = ActiveSupport::HashWithIndifferentAccess.new(i) @item = Item.find(item_hash.item_id) if !@item.is_active @not_available_items.push( { item_id: item_hash.item_id, item_name: item_hash.item_name } ) end end
额外优化建议
可以用批量查询减少数据库访问次数,提升效率:
# 先提取所有商品ID item_ids = @line_item.map { |i| i["item_id"] } # 一次查询所有失效商品 inactive_items = Item.where(id: item_ids, is_active: false).pluck(:id, :name) # 直接生成结果数组 @not_available_items = inactive_items.map do |id, name| { item_id: id, item_name: name } end
内容的提问来源于stack exchange,提问作者zippax
相关产品推荐
相关产品推荐

