在我的 Rails 应用程序中,我的每个组都有_many :expenses。每笔费用有_many :shares。我已经成功设置了一个嵌套表单,它允许我同时创建费用和份额。但是,当我使用相同的表单尝试编辑费用时,我为确保所有份额的总和等于费用总额而设置的验证失败。
这是我的控制器的更新方法:
def update
@expense = Expense.find(params[:id])
@group = Group.find(params[:group_id])
if @expense.update_attributes(params[:expense])
redirect_to @group
else
render 'edit'
end
end
在我的模型文件中,我已经在费用.rb 中声明了accepts_nested_attributes_for :shares,并将 :shares_attributes 添加到其 attr_accessible 列表中。
我在费用中设置的验证失败是:
def shares_must_equal_total_amount
if self.shares.sum(:amount) != self.amount
errors.add(:shares, " must equal expense amount")
end
end
我最困惑的是,如果我
puts @expense.amount and
@expense.shares.sum(:amount)
在我的更新方法的 else 子句中(在渲染“编辑”之前),这两个值是不同的。但是,在 params[:shares_attributes] 中,各个份额的数量显然正在更新并通过验证。因此,由于某种原因,当我调用 if @expense.update_attributes(params[:expense]) 时,@expense.shares 没有被更新。
我在这里想念什么?谢谢您的帮助。