関連するオブジェクトの数をチェックするカスタム検証に問題があります。 Event
とGuest
の2つのクラスがあります。作成時および更新時に異なる動作をする関連オブジェクトの検証
ユーザーが新しいイベントを作成すると、招待するゲストを選択できます。保存すると、招待されたゲストの数を確認したいと思います。
既存のイベントを更新するときに検証が正常に機能します。しかし、新しいイベントの作成時にself.guests.count
が0
を返すので、検証は失敗します。 コントローラで、私は選択したゲストが同じ方法でモデルに渡されたことを確認しました:params[:event][:guest_ids]
。
更新の場合、妥当性確認ブロックが呼び出される前にアソシエーションテーブルを更新するSQL INSERT INTO
がトランザクションキューに追加されていることがわかります。新しいイベントが発生した場合は、検証が失敗する前にSQL INSERT
が表示されません。
私はここで何が欠けていますか?いくつかの回避策について考えていましたが、これを実装する適切な方法があると確信しています。
Railsのバージョンは4.2.6
class Event < ActiveRecord::Base
has_and_belongs_to_many :guests
validate :check_guestlist
def check_guestlist
guest_count=self.guests.count
if guest_count < 3
errors.add(“Please invite more guests”)
end
end
class Guest < ActiveRecord::Base
has_and_belongs_to_many :events
end
class EventsController < ApplicationController
def create
@event = current_user.events.new(event_params)
respond_to do |format|
if @event.save
format.html { redirect_to @event, notice: 'Event was successfully created.' }
else
flash.now[:alert]='Event not saved.'
format.html { render action: "new" }
end
end
end
def update
@event = current_user.events.find(params[:id])
respond_to do |format|
if @event.update_attributes(event_params)
format.html { redirect_to @event, notice: 'Event was successfully updated.' }
else
flash.now[:alert]='Changes not saved.'
format.html { render action: "edit" }
end
end
end
end
イベントモデルのゲスト用にaccept_nested_attributesを追加してみてください。エラーが解決しない場合は、コントローラのメソッドとフォームを追加してください。 – Zero
ありがとう!私は 'accepts_nested_attributes_for:guests'を追加しようとしましたが、それは助けになりませんでした。コントローラーコードが元の質問に追加されました。 – Peb