1

在我的 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 没有被更新。

我在这里想念什么?谢谢您的帮助。

4

0 回答 0