Ajax_indicator
закроется через 10 сек Frontend_notifier_close_notification_ico
На сервере произошла ошибка. Мы уже уведомлены об этом и скоро разберемся.
Мы учим полезным скиллам
Вы не залогинены. Чтобы быстро подписываться на интересующие разделы и задавать вопросы в Q/A вам нужно войти или зарегистрироваться.

Ruby On Rails -> вопросы

Upvote Upvote_done
0
Downvote Downvote_done

Не работает ассоциация has_many/belongs_to

задал [без логина] 4 месяца назад
У меня есть таблица cart(корзины), product(продукты, есть поле price), line_items(товарные позиции, с полями cart_id, product_id, quantity).
Мне надо подсчитать сумму всего заказа, которые находится в данной корзине.
Пример таблицы line_items
id | product_id | cart_id | created_at | updated_at | quantity
62 | 1 | 72 | 2013-04-20 13:58:32.783384 | 2013-04-20 14:07:00.66162 | 6
63 | 2 | 72 | 2013-04-20 14:07:09.289013 | 2013-04-20 14:07:10.130877 | 2

Есть вид:<span>Cost: <strong><%= number_to_currency(@cart.total_price) %></strong></span>`Есть модель cart:
class Cart < ActiveRecord::Base
  # attr_accessible :title, :body
  has_many :line_items, dependent: :destroy
end
public
def total_price
  line_items.to_a.sum {|item| item.total_price}
end

Есть модель LineItem:
class LineItem < ActiveRecord::Base
  attr_accessible :cart_id, :product_id
  belongs_to :cart
  belongs_to :product
end

public
def total_price
  product.price * quantity
end

Не хочет работать выдает ошибку: undefined local variable or method product' for #<Cart:0xb61e3050>`
Дополнительный вопрос по теме: допустим есть какой-то метод в модели, как я могу обратиться к нему из любого вида?
Преждем чем вы сможете написать ответ, вы должны зарегистрироваться или войти.

Ответы:

Upvote Upvote_done
0
Downvote Downvote_done
Correct_answer_done
ответил Роман Снитко 4 месяца назад
1. Я изменил заголовок вопроса, т.к. проблема вовсе не в instance variable, а в неправильном использовании ассоциации.

2. Слово public использовать необязательно. И так понятно, что методы публичные. А вот поместить их ВНУТРЬ класса надо, иначе к чему они относятся тогда?

Из сообщения об ошибке видно, что у вас метод #product вызывается на Корзине, а не на LineItem. Скорее всего вы что-то напутали и не туда его поместили. Сказать сложно, т.к. у вас творится непонятная фигня с этими паблик методами по каким-то причинам вынесенными за пределы класса.

Пожалуйста, в следующий раз потрудитесь форматировать код не символами обратной кавычки, а 4 пробелами. И делайте нормальное количество отступов в нужных строках - иначе невозможно же читать.

Комментарии к этому ответу:

А переменная @cart доступна только в виде cart или во всех видах и application.html.erb?

— написал [без логина]

Переменную @cart вам нужно создать в контроллере и тогда она станет доступна в шаблонах, которые рендерятся конкретным экшеном контроллера, где была создана эта переменная.

— написал Роман Снитко