【问题标题】:rails prevent object creation in before_create callbackrails 防止在 before_create 回调中创建对象
【发布时间】:2015-01-20 09:34:33
【问题描述】:

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

before_create :check_if_exists

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

我也愿意寻求更好的解决方案!

我需要这个来防止偶尔重复 API 调用。

【问题讨论】:

  • 你正在触及回调地狱。下一步:您将从模型中删除它们并将这些行为抽象到服务对象中

标签: ruby-on-rails callback


【解决方案1】:
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

【讨论】:

  • 谢谢!在这种情况下,验证肯定比回调更好!点赞
【解决方案2】:

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

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

The docsThe guide

【讨论】:

  • 我想在讨论范围内验证 post.body 的唯一性,它正在创建的地方。你觉得有可能吗?
  • validates :body, uniqueness: {scope: :discussion_id} 可能是您正在寻找的。使用旧的哈希语法:validates :body, :uniqueness =&gt; {:scope =&gt; :discussion_id}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多