Ruby on rails Rails:在创建之前调用验证

Ruby on rails Rails:在创建之前调用验证,ruby-on-rails,validation,callback,Ruby On Rails,Validation,Callback,据我所知。不过,我的行为却暗示了另一种情况。具体而言,我有: 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(:gr

据我所知。不过,我的行为却暗示了另一种情况。具体而言,我有:

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_或create_成员资格首先运行,从而将状态设置为invested。关于发生了什么或如何解决这种情况有什么想法吗?

首先运行的是“查找”或“创建”会员资格

创建时操作的顺序:

before_validation
after_validation
before_save
around_save
before_create
after_create
after_save
首先运行的是查找或创建成员资格

创建时操作的顺序:

before_validation
after_validation
before_save
around_save
before_create
after_create
after_save

问题实际上源于我的控制器:

invitation = User::GroupInvitation.create(params[:user_group_invitation])
if invitation.valid?
  . . . .
else
  . . . .
end
这导致验证方法在邀请期间第二次被调用。valid?,当然,它会在已设置状态时发送错误消息。解决这个问题很容易。我只是添加了一个:on=>:create条件:

validate :user_can_be_invited, :on => :create

问题实际上源于我的控制器:

invitation = User::GroupInvitation.create(params[:user_group_invitation])
if invitation.valid?
  . . . .
else
  . . . .
end
这导致验证方法在邀请期间第二次被调用。valid?,当然,它会在已设置状态时发送错误消息。解决这个问题很容易。我只是添加了一个:on=>:create条件:

validate :user_can_be_invited, :on => :create

有没有办法让它在事后运行?我尝试将after_create更改为after_validation,但我得到了相同的行为。我不清楚您的代码,但要颠倒回调顺序,您可以在after_create或after_save回调中调用用户。为了解决这个问题,我发布了回调的顺序。你能看到这个pdf吗?顺序来自该pdf的第2页。请在此检查答案:查看第2页,似乎验证确实在创建前回调之前运行,考虑到我的代码的行为,这很奇怪。有没有办法在之后运行它?我尝试将after_create更改为after_validation,但我得到了相同的行为。我不清楚您的代码,但要颠倒回调顺序,您可以在after_create或after_save回调中调用用户。为了解决这个问题,我发布了回调的顺序。你能看到这个pdf吗?顺序来自该pdf的第2页。请在此检查答案:查看第2页,似乎验证确实在创建前回调之前运行,考虑到我的代码的行为,这是很奇怪的。