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

时间:2011-08-01 18:08:54

标签: ruby-on-rails forms view models nested-attributes

我在外国模型视图中渲染模型的属性时遇到问题。我认为这是一个嵌套属性问题,因为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>

视图/推车/ 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

bike.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

1 个答案:

答案 0 :(得分:1)

您的错误告诉您对象f.bike属于类nil。你本以期望它是类Bike的一个实例。显然,您的视图中有一个没有附加自行车记录的订单项。 要处理错误,以便显示您的视图,只需添加空白支票吗?

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

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

根据以下评论更新 你的button_to看起来有点不对劲。尝试

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

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

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

更新结束

希望有所帮助