【问题标题】:Rails: Validation Being Called After before_createRails:在 before_create 之后调用验证
【发布时间】:2013-02-28 13:07:30
【问题描述】:

据我所知,validations are suppose to run before 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。关于发生了什么或如何解决这种情况的任何想法?

【问题讨论】:

    标签: ruby-on-rails validation callback


    【解决方案1】:

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

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

    这导致验证方法在invitation.valid? 期间被第二次调用,当然它会发送错误消息,因为已经设置了status。解决问题很容易。我只是添加了一个:on =&gt; :create 条件:

    validate :user_can_be_invited, :on => :create
    

    【讨论】:

      【解决方案2】:

      find_or_create_membership 先运行

      创建时动作的顺序:

      before_validation
      after_validation
      before_save
      around_save
      before_create
      after_create
      after_save
      

      【讨论】:

      • 以后有什么办法让它运行吗?我尝试将after_create 更改为after_validation,但我得到了相同的行为。
      • 我不是很清楚你的代码,但是要颠倒你的回调顺序,你可以在after_createafter_save回调上调用user_can_be_invited。解决它,我发布了回调的顺序。
      • 你能看到这个 pdf 文件吗? edx.org/static/content-berkeley-cs169.2x~2013_Spring/handouts/…订单来自该pdf的第2页。
      • 也可以在这里查看答案:stackoverflow.com/questions/10969673/…
      • 查看第 2 页,似乎验证确实在 before_create 回调之前运行,考虑到我的代码的行为方式,这很奇怪。
      猜你喜欢
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 2016-10-26
      • 2014-10-10
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 2012-11-23
      相关资源
      最近更新 更多