我在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
}
}
}
}
答案 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_create和validate_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'