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
。并阅读如何验证模型和添加错误。
是的。 Before Create 只是一个回调,将在您调用 User.save 时执行。但是如果你想停止创建记录。你使用 validation.Write 你的自定义验证
validates_with :check_name
您可以做一件简单的事情,将其添加到您的模型中:
validates_uniqueness_of :name, :scope => :place
并删除所有代码,即 before_create 及其方法。
在我的 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
。并阅读如何验证模型和添加错误。
是的。 Before Create 只是一个回调,将在您调用 User.save 时执行。但是如果你想停止创建记录。你使用 validation.Write 你的自定义验证
validates_with :check_name
您可以做一件简单的事情,将其添加到您的模型中:
validates_uniqueness_of :name, :scope => :place
并删除所有代码,即 before_create 及其方法。