我在外国模型视图中渲染模型的属性时遇到问题。我认为这是一个嵌套属性问题,因为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
答案 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
更新结束
希望有所帮助