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

发布于 2024-11-27 11:40:38 字数 1859 浏览 0 评论 0原文

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

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

I am having trouble rendering a model's attributes in foreign model's view. I think it is a nested attributes problem because f.bike works but f.bike.biketype gives an undefined method error. Below is my error and code. Any help would be great. Thanks!

Error from Browser:

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冷…雨湿花 2024-12-04 11:40:38

你的错误告诉你对象 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) 您没有正确访问参数哈希来从中获取自行车 ID
或者
2) 在保存记录之前,您没有在行项目上设置自行车 ID。

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

更新结束

希望有帮助

Your error is telling you that the object f.bike is of class nil. You would have been expecting it to be an instance of class Bike. Obviously you have a line item in your view that doesn't have a bike record attached to it.
To take care of the error so your view will display just add a check for blank?

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

As to why you have a line item with no bike? Well that's an entirely different question and there is not enough info here to answer that.

UPDATE Based on comments below
Your button_to looks a little wrong. Try

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

Using the curly braces ensures that Rails knows the second param is a css style not a param to be passed into the controllers action
To check if your bike id is getting into the controller then check the params that are actually getting into the controller action that add the bike to the line item. You will be able to find this in your development.log file, find the post request for the action and one of the first lines in that action will list all the params. If you see the bike_id in that list then either one of 2 possible situations is occurring.
1) You are not accessing the params hash properly to get the bike id from it
or
2) You are not setting the bike ID on the line item before saving the record.

You should be able to access the id using params[:bike_id]
If you don't see the bike id then you need to look again at the button_to code to see why it's not passing the bike ID

End of update

Hope that helps

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文