私の Rails アプリケーションでは、私のグループのそれぞれに has_many :expenses があります。各費用には、多くの :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
私のモデル ファイルでは、expense.rb で accept_nested_attributes_for :shares を記述し、attr_accessible リストに :shares_attributes を追加しました。
失敗しているexpense.rbで設定した検証は次のとおりです。
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)
update メソッドの else 節 (render 'edit' の前) では、2 つの値が異なります。しかし、params[:shares_attributes] では、個々の株式の金額が明らかに更新され、検証に合格しています。そのため、if @expense.update_attributes(params[:expense]) を呼び出すと、何らかの理由で @expense.shares が更新されません。
ここで何が欠けていますか?助けてくれてありがとう。