Ruby on rails Rails到符号问题?错误:nil:NilClass的未定义方法“[]”

Ruby on rails Rails到符号问题?错误:nil:NilClass的未定义方法“[]”,ruby-on-rails,Ruby On Rails,背景信息:一笔交易有很多优惠券@freeDeals包含所有优惠券,优惠券属于一笔交易 控制器: @freeCoupons = Coupon.where(discount: 100).order("created_at DESC").page(params[:page]) @deals = Deal.all 下面的代码与我想要的完全一样,并找到了2中硬编码的交易标题,用于测试 <% @freeCoupons.each do |f| %> <%= @deals[2

背景信息:一笔交易有很多优惠券@freeDeals包含所有优惠券,优惠券属于一笔交易

控制器:

 @freeCoupons = Coupon.where(discount: 100).order("created_at DESC").page(params[:page])
 @deals = Deal.all
下面的代码与我想要的完全一样,并找到了2中硬编码的交易标题,用于测试

<% @freeCoupons.each do |f| %>
      <%= @deals[2][:title] %>

 <% end %>
但是当我通过f.deal\u id根据优惠券协会找到交易的标题时

<% @freeCoupons.each do |f| %>
      <%= @deals[f.deal_id][:title] %>

<% end %>
它为nil:NilClass提供了一个未定义的错误方法“[]”。不知道我错过了什么。我错过的是一个符号问题吗?任何帮助都将不胜感激。

交易id是数据库中的id,而不是数组中的索引。deal_id可以比元素的数量大得多。然后你会得到一个零,当你尝试访问标题时会出现错误

您可以通过ID和查找对象

Deal.find(f.deal_id)

在你的优惠券模型中

属于:交易

然后在控制器中,使用includes包含交易-这将确保您不会进行N+1查询:

@free_coupons = Coupon.includes(:deal).where(discount: 100).order("created_at DESC").page(params[:page])
现在在您看来,您只需在优惠券实例上调用deal方法:

@free_coupons.each do |f|
  <%= f.deal.title %>
end

每个优惠券记录是否保证有一个指向现有交易的交易id?@潜伏者正确。每张优惠券都有一个与之关联的交易id号。类似于一篇文章表面上会有一个blog_i,这看起来应该很好。然而,也许你的一个假设是不正确的?您需要通过在@freecomports.each循环中明确检查每个f的f.deal\u id是否有效,然后检查@deals[f.deal\u id]是否有效来测试这一点。您没有说明错误指向哪一行代码,但我假设它是@deals[f.deal\u id][:title],因此@deals必须为零,或者@deals[f.deal\u id]必须为零才能得到该错误。您需要进行一些调试才能找到它。Logan Serman提供了最好的答案。始终利用你的人际关系。从您的问题可以清楚地看出,您已经建立了从优惠券到交易的归属关系,因此您可以调用Coupon.Deal.title来获取优惠券的交易标题。OP:这是迄今为止最好的答案。Rails方法让您使用模型之间的关系来获取相关数据。这是错误的方向。你在表面上解决他的问题,但没有解决更大的问题,即他为什么不利用他的关系。我不同意。你需要先学会走路,然后才能跑。用户需要知道为什么会发生此错误,即使他后来使用了另一种方法。谢谢!很高兴看到应该怎么做,尽管洛根的答案是像理查德说的那样做的更恰当的方式。我最初想到了这个解决方案,但试图避免在视图中执行find查询,因为这打破了我所理解的mvc方式。