update_attributes带有验证

时间:2010-05-26 14:31:18

标签: ruby-on-rails

我在Rails中有以下设计的例子。我想确保Garage模型至少有一辆车。

class Garage
    has_many :cars
    validate :at_least_one_car
    accepts_nested_attributes_for :cars, :allow_destroy => true

    def at_least_one_car
        if cars.count == 0
          errors.add_to_base("needs at least one car")
        end
    end
end

class Car
    belongs_to :garage
end

在我的表单中,我有一个删除按钮,可以将现有汽车的隐藏字段_delete设置为true。假设只有一个汽车对象,我在表单中“删除”它,如果我执行garage_object.update_attributes(params [:garage]), 它将删除汽车模型并使车库对象无效。有没有办法让它更新属性,如果它会使模型无效?

params = {
  :garage => {
    :car_attributes => {
      ["0"] => {
        _delete => true,
        # other attributes here
      }
    }
  }
}

2 个答案:

答案 0 :(得分:1)

我相信您可以添加validates_presence_of :car,因此如果没有关联的汽车,garage_object将不会更新。

class Garage
    has_many :cars
    validates_presence_of :cars
end

class Car
    belongs_to :garage
end

答案 1 :(得分:0)

从小知道我知道你的问题将对你有所帮助。

您需要一些验证,应该在创建对象时进行检查,而不是在更新时进行检查。 使用validate_on_createvalidate_on_update方法

class Garage
    has_many :cars


    def validate_on_create
        if cars.count == 0
          errors.add_to_base("needs at least one car")
        end
    end
end

class Car
    belongs_to :garage
end

希望有所帮助:)

EDITED

您正在使用什么来删除对象

销毁或删除

当你使用'删除'时,没有回调被取消

当你使用'destroy'时,在删除对象之前会触发所有回调和过滤器。

所以检查并使用'destroy'