before_create 规则无效

before_create rule not working

在我的 user.rb 模型中,我有以下内容:

    before_create :check_name

    def check_name
        user = User.where(:name => self.name, :place => self.place)
        if user.present?
          p "ccccccccccccccccccccccccccccccccccccccccc"
          @error = "Same combination of name and place are already present"
          return @error
        end
      end

在我的控制器中:

    def create
        error_flag = false
        @user =User.new(user_params)
        if @user.save
          error_flag = true
          @success = I18n.t('user.success.user_created')
        else
          @error = find_error(@user)
        end

        respond_to do |format|
          format.js {
            render :layout => false,
                   :locals => {
                     :request => error_flag,
                     :user => @user
                   }
          }
        end
  end

我的目标是如果模型中定义的条件为真则不创建用户,但无论如何都会创建用户。知道我做错了什么吗?

您在模型中的 before_create 回调不会在模型中添加错误。 Use validate instead of before_create 用于添加错误,那么您的记录不会保存到数据库并且 @user.save 返回 false:

validate :check_name

def check_name
   user = User.where(:name => self.name, :place => self.place)
   errors.add(:base, "Something wrong") if user.present?
end

如果您想使用 before_create 回调来添加错误:

before_create :check_name

def check_name
   user = User.where(:name => self.name, :place => self.place)
   errors.add(:base, "Something wrong") if user.present?
end

在这种情况下更喜欢使用 validate 而不是 before_create。并阅读如何验证模型和添加错误。

阅读how validate model and add errors.

是的。 Before Create 只是一个回调,将在您调用 User.save 时执行。但是如果你想停止创建记录。你使用 validation.Write 你的自定义验证

validates_with :check_name

您可以做一件简单的事情,将其添加到您的模型中:

validates_uniqueness_of :name, :scope => :place

并删除所有代码,即 before_create 及其方法。