before_create规则不起作用

时间:2015-04-24 07:33:43

标签: ruby-on-rails callback

在我的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

我的目标是,如果模型中定义的条件为真,则不创建用户,但无论如何都要创建用户。我有什么想法吗?

3 个答案:

答案 0 :(得分:2)

模型中的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.

答案 1 :(得分:0)

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

validates_with:check_name

答案 2 :(得分:0)

你可以在你的模型中添加一个简单的东西:

Test.EmptyIfNull().Where(k => k.number ==2).FirstOrDefault();

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