0

我在 Rails 3 应用程序中有一个课程模型和一个学生模型。当课程价格更新时,它会影响学生中称为“余额”的属性。

当我更新课程价格时,我想通过隐藏字段传递旧价格。然后我在课程模型中有一个私有方法,看起来像这样..

class Lesson < ActiveRecord::Base
  attr_accessible :student_id, :price

  belongs_to :student

  around_update :adjust_student_balance

  private

    def adjust_student_balance
      @student = Student.find(self.student_id)
      @student.balance -= @old_price
      yield
      @student.balance += self.price
      @student.update_attributes(:balance => @student.balance)
    end
end

如您所见,我正在尝试 (1) 从学生的余额中减去旧价格,(2) 对课程执行更新,然后 (3) 将新价格添加到学生的余额中。

但是上面的代码不起作用,因为我试图从模型中访问@old_price控制器中声明的实例变量。经过一番搜索,我意识到这不仅行不通,而且违反了 MVC 的一个重要原则。

我应该如何正确地做到这一点?我应该在控制器中做所有事情吗?看来我的控制器已经变得很大了。顺便说一句,我对此很陌生。

4

1 回答 1

0

尝试以下(未经测试的)代码:

class Lesson < ActiveRecord::Base
  attr_accessible :student_id, :price

  belongs_to :student

  after_save :adjust_student_balance

  private

  def adjust_student_balance
    student = self.student

    student.balance -= self.price_was
    student.balance += self.price

    student.save
  end
end

它使用Active Model Dirty. 查看http://api.rubyonrails.org/classes/ActiveModel/Dirty.html以了解有关此主题的更多信息。

于 2013-06-12T19:58:28.203 回答