2

私が知る限り、検証は callbacks の前に実行されると想定されています。ただし、そうでないことを示唆する動作が発生しています。具体的には、私は持っています:

class User::GroupInvitation < ActiveRecord::Base

  validate :user_can_be_invited

  before_create :find_or_create_membership

  private

    def user_can_be_invited
      user_membership = User::Membership.where(:group_id => self.group_id, :user_id => self.invitee_id).first
      if user_membership.present?
        case user_membership.status
        when "invited"
          errors[:base] << I18n.t("user.group_invitations.create.this_user_is_already_invited")
        end
      end
    end

    def find_or_create_membership
      user_membership = User::Membership.where(:group_id => self.group_id, :user_id => self.invitee_id).first_or_create(:status => "invited")
      user_membership.update_column(:status, "invited") unless user_membership.new_record?
      self.user_membership_id = user_membership.id
    end
end

このコードをテストすると、ユーザーが以前に招待されていない場合でも、「このユーザーは既に招待されています」というエラーが一貫して表示されます。find_or_create_membershipが最初に実行され、それによって に設定statusされるため、これが発生していると推測できますinvited。何が起こっているか、または状況を解決する方法についてのアイデアはありますか?

4

2 に答える 2

9

find_or_create_membership最初に実行中です

作成中のアクションの順序:

before_validation
after_validation
before_save
around_save
before_create
after_create
after_save
于 2013-03-12T20:09:31.903 に答える
2

問題は実際には私のコントローラーに起因します:

invitation = User::GroupInvitation.create(params[:user_group_invitation])
if invitation.valid?
  . . . .
else
  . . . .
end

これにより、検証メソッドが の間に 2 回呼び出され、当然、が既に設定されているinvitation.valid?ため、エラー メッセージが送信されました。status問題の修正は簡単でした。私は単に:on => :create条件を追加しました:

validate :user_can_be_invited, :on => :create
于 2013-03-13T16:10:24.360 に答える