Вложенные атрибуты при просмотре нескольких моделей (не форма) - PullRequest
0 голосов
/ 01 августа 2011

У меня проблемы с отображением атрибутов модели в представлении сторонней модели. Я думаю, что это проблема вложенных атрибутов, потому что 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 Ответ

1 голос
/ 02 августа 2011

Ваша ошибка говорит вам, что объект 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, а не параметром, который нужно передать в действие контроллеров. Чтобы проверить, попадает ли ваш идентификатор велосипеда в контроллер, проверьте параметрыкоторые фактически попадают в действие контроллера, которое добавляет велосипед в позицию.Вы сможете найти это в своем файле development.log, найти пост-запрос для действия, и одна из первых строк этого действия перечислит все параметры.Если вы видите bike_id в этом списке, то возникает одна из 2 возможных ситуаций.1) Вы не обращаетесь к хэшу параметров правильно, чтобы получить от него идентификатор велосипеда, или 2) Вы не устанавливаете идентификатор велосипеда в позиции перед сохранением записи.

У вас должен быть доступ к идентификаторуиспользование params[:bike_id] Если вы не видите идентификатор велосипеда, вам нужно еще раз взглянуть на код button_to, чтобы понять, почему он не передает идентификатор велосипеда

Конец обновления

Надеюсь, что поможет

...