rails阻止在before_create回调中创建对象

时间:2015-01-20 09:34:33

标签: ruby-on-rails callback

我想检查新记录的某些属性,如果某些条件为真,则阻止创建对象:

before_create :check_if_exists

def check_if_exists
  if condition
    #logic for not creating the object here
  end
end

我也愿意接受更好的解决方案!

我需要这样做以防止偶尔重复的API调用。

由于

2 个答案:

答案 0 :(得分:8)

before_create :check_if_exists

def check_if_exists
  errors[:base] << "Add your validation message here"
  return false if condition_fails
end

更好的方法:

您应该考虑在此处使用验证,而不是选择回调。如果条件失败,验证肯定会阻止对象创建。希望能帮助到你。

  validate :save_object?
  private: 
   def save_object?
     unless condition_satisifed
       errors[:attribute] << "Your validation message here"
       return false
     end
   end

答案 1 :(得分:5)

您也可以使用唯一性验证器......实际上这是一种更好的方法,因为它们适用于这些情况。

回调的另一个问题是,如果一切正常,你必须确保它返回true(或真值),因为如果回调返回falsenil ,它将不会被保存(如果您的if条件评估为false并且之后没有其他任何内容运行,正如您所写的那样,您的方法将返回nil导致您的记录不被保存)

The docsThe guide