查看多个模型(不是表单)时的嵌套属性

Posted

技术标签:

【中文标题】查看多个模型(不是表单)时的嵌套属性【英文标题】:Nested Attributes when Viewing Multiple Models (not a form) 【发布时间】:2011-08-01 18:08:54 【问题描述】:

我无法在外国模型的视图中渲染模型的属性。我认为这是一个嵌套属性问题,因为f.bike 有效,但f.bike.biketype 给出了未定义的方法错误。以下是我的错误和代码。任何帮助都会很棒。谢谢!

来自浏览器的错误:

NoMethodError in Carts#show

Showing /Users/willdennis/rails_projects/spinlister/app/views/carts/show.html.erb where line #4 raised:

undefined method `biketype' for nil:NilClass
Extracted source (around line #4):

1: <h2>Your Cart</h2>
2:  <ul>
3:      <% @cart.line_items.each do |f| %>
4:      <li><%= f.bike.biketype %></li>
5:      <% end %>
6:  </ul>

views/carts/show.html.erb

<h2>Your Cart</h2>
<ul>
    <% @cart.line_items.each do |f| %>
    <li><%= f.bike.biketype %></li>
    <% end %>
</ul>

cart.rb

class Cart < ActiveRecord::Base
  has_many :line_items, :dependent => :destroy
  belongs_to :user

  accepts_nested_attributes_for :line_items

  attr_accessible :bike_id, :name, :description, :size, :biketype, :price, :photo, :id, :address, :city, :state, :zip, :latitude, :longitude, :neighborhood 
end

line_item.rb

class LineItem < ActiveRecord::Base
  belongs_to :bike
  belongs_to :cart

  accepts_nested_attributes_for :bike, :cart

  attr_accessible :name, :description, :size, :biketype, :price, :photo, :id, :address, :city, :state, :zip, :latitude, :longitude, :neighborhood 

end

自行车.rb

class Bike < ActiveRecord::Base

has_many :line_items

attr_accessible :name, :description, :size, :biketype, :price, :photo, :id, :address, :city, :state, :zip, :latitude, :longitude, :neighborhood 

end 

carts_controller.rb

  def show
  @cart = Cart.find(params[:id])
  end

【问题讨论】:

您确定数据库中的每个 line_item 都确实有关联的自行车吗?该错误表明其中一个自行车对象为 nil,如果 line_item 的 bike_id 为 nil 或引用不存在的自行车,这就是您所期望的。 我认为你可能是对的。当我检查我的数据库时,line_items 没有bike_id。这是我的 line_items_controller:def create @cart = current_cart bike = Bike.find(params[:bike_id]) @line_item = @cart.line_items.build(:bike_id =&gt; bike) 知道如何正确地将 bike_id 添加到 line_item 中吗?非常感谢! 【参考方案1】:

您的错误是告诉您对象 f.bike 属于 nil 类。您会期望它是 Bike 类的一个实例。显然,您的视图中有一个没有附加自行车记录的行项目。 要解决该错误,以便显示您的视图,只需添加一个空白检查?

li><%= f.bike.biketype unless f.bike.blank? || f.bike.biketype.blank? %></li>

为什么您的订单项没有自行车?嗯,这是一个完全不同的问题,这里没有足够的信息来回答这个问题。

更新基于下面的 cmets 您的 button_to 看起来有点不对劲。试试

<%= button_to "Rent this Bicycle!", line_items_path(:bike_id => @bike), :id => "rentthisbike" %>

使用花括号确保 Rails 知道第二个参数是 css 样式而不是传递给控制器​​动作的参数 要检查您的自行车 ID 是否进入控制器,然后检查实际进入控制器操作的参数,该控制器操作将自行车添加到订单项。您将能够在您的 development.log 文件中找到它,找到该操作的发布请求,该操作的第一行将列出所有参数。如果您在该列表中看到bike_id,则两种可能的情况之一正在发生。 1)您没有正确访问参数哈希以从中获取自行车 ID 或者 2) 在保存记录之前,您没有在订单项上设置自行车 ID。

您应该能够使用params[:bike_id] 访问该ID 如果您没有看到自行车 ID,那么您需要再次查看 button_to 代码,看看为什么它没有通过自行车 ID

更新结束

希望有帮助

【讨论】:

是的,这有帮助。谢谢。我认为问题是将bike_id 传递给line_item。我的自行车/视图/节目中有&lt;%= button_to "Rent this Bicycle!", line_items_path(:bike_id =&gt; @bike.id), :id =&gt; "rentthisbike" %&gt;,我的line_items_controller.rb 中有def create @cart = current_cart @bike = Bike.find(params[:bike_id]) @line_item = @cart.line_items.build(:bike_id =&gt; @bike) end。有什么想法吗?我相信 line_item 构建不正确。非常感谢。 @Will Dennis,我已经相应地更新了我的答案,尽管如果没有全貌,这真的很难回答。也许这应该是另一个问题,如果我给您的内容不起作用,那么可以专注于在订单项上设置自行车的问题的详细信息。在任何进一步的帖子中包含将自行车保存到行项目的参数哈希和控制器代码,以便更清楚地诊断问题 感谢您的帮助。我已尝试指定问题并在此处包含开发日志 POST。似乎参数是正确的,没有发布正确的 bike_id 值。 ***.com/questions/6905417/… 我会看看那个问题,但不要忘记你会有仍然错误的遗留数据。这仍然不适用于新订单项吗?

以上是关于查看多个模型(不是表单)时的嵌套属性的主要内容,如果未能解决你的问题,请参考以下文章

带有has_many的Rails嵌套表单:通过,如何编辑连接模型的属性?

通过复选框Rails 4添加多个嵌套属性(可能有多种形式)

Rails多个嵌套表单问题

发生错误时如何在嵌套模型中填充表单?

如何仅更新 rails 6 中 current_user 的嵌套表单属性?

CakePHP 中的嵌套表单