在保存操作和验证之前

时间:2014-06-29 08:27:52

标签: ruby-on-rails ruby-on-rails-4

我的应用程序有一个逻辑: 保存前的父模型生成子模型元素。

我想在保存父元素之前验证它至少有一个子元素。

我尝试过使用validates_presence_of,但是在之前调用了#before;之前调用了所以父母没有子元素。

您能告诉我应该在哪里生成子元素以及验证是否存在子元素?

2 个答案:

答案 0 :(得分:2)

如果我误解了你的问题,请纠正我,但你想在父模型触发'before_save'回调之前检查父模型是否至少有1个孩子(这会做任何想做的事),对吧?

如果是,您可以使用'before_validation'回调。在'before_save'之前调用'before_validation'。所以你可以这样做:

before_validation { self.errors.add(:base, 'error here or something') if self.children.count < 1 }

请注意,如果资源的'errors'数组不为空,则rails甚至不会尝试保存资源(因此不会调用before_save回调)。在'before_save'回调中执行'self.errors.add'不会阻止资源被保存。如果要阻止资源从'before_save'回调中保存,您可以执行以下操作:

before_save do 
  self.errors.add(:base, 'error here or something')
  false
end

希望有所帮助。 :)

干杯!

答案 1 :(得分:0)

这样的事情:

class Hero < ActiveRecord::Base
  has_many :weapons

  before_save :check_equipment

  private
    def check_equipment
      errors.add(:weapons, "are not equipped") if weapons.size < 1 
    end
end

class Weapon < ActiveRecord::Base
  belongs_to :hero
end

您可以将武器创建为独立对象,然后将武器与英雄相关联,或者您也可以使用accepts_nested_attributes_for方法与英雄创建武器。解决方案取决于您的应用程序架构。