Расчет Ruby on Rails

На самом деле я пытаюсь выполнить умножение в проекте. У меня есть 2 модели: родительская модель и дочерняя модель. Я хочу показать результат умножения, выполненного на дочерней модели, в родительском представлении, вызвав метод умножения. Вот код:

app / models / drink.rb ака детская модель

class Drink < ActiveRecord::Base
  belongs_to :menu 
  before_create :total_amount  
  before_save :total_amount 

  def total_amount
    self.quantity * self.price * 1.30
end   
end 

> в app / models / menu.rb или родительской модели

class Menu < ActiveRecord::Base
    has_many :drinks, :dependent => :destroy
    accepts_nested_attributes_for :drinks, :allow_destroy => true

end  

в views / menu / show.html.erb

<td><%=number_to_currency(@menu.total_amount) %> </td>

и сообщение об ошибке:

неопределенный метод total_amount для nil: NilClass

Очевидно, что total_amount является атрибутом модельного напитка. Что я делаю не так. Спасибо за помощь.

ruby-on-rails,

0

Ответов: 3


Очевидно, total_amount является атрибутом модельного напитка.

Да, этот метод в модели напитка (кстати, если это атрибут, то он объявляется в вашей миграции. То, как вы его настроили, total_amount не будет сохранено в базе данных), но вы вызываете это на примере меню.

Как сказал Миша М, @ menu.drinks.total_amount.


Вам нужно добавить функцию, вызываемую total_amountв ваш класс Menu, а затем выполнить итерацию по всем напиткам и суммировать общее количество каждого напитка.


1 принят

Дело в том, что проблема в том, что количество и цена напитка не были установлены. Часть решения исходит от Wizard of Ogz. Факт в том, что попытка решить «ноль не может быть приведен в BigDecimal», я получаю решение на эту проблему тоже. Так вот решение

1-app / models / drink.rb aka child model Примените к self.quantity и self.price метод, который преобразует их в строку (to_s), а затем в большой десятичный код (to_d).

class Drink < ActiveRecord::Base
  belongs_to :menu 
  before_save :total_amount 

  def total_amount
    self.quantity.to_s.to_d * self.price.to_s.to_d * 1.30
  end   
end

2-app / models / drink.rb ака детская модель проверяет наличие цены и количества перед сохранением их в базу данных

class Drink < ActiveRecord::Base
      belongs_to :menu 
      before_save :total_amount

      validates :price, :presence => true 
      validates :quantity, :presence => true 

      def total_amount
        self.quantity.to_s.to_d * self.price.to_s.to_d * 1.30
      end   
end

3-приложение / views / menus / show.html.erb или родительская модель

Просто примените метод total_amount к модели dink или дочерней (вложенной) следующим образом:

<td><%=number_to_currency(drink.total_amount) %> </td>

Спасибо Волшебнику Огза , Митчу Демпси , Сосборну и Мише М.

Рубин на рельсах,
Похожие вопросы