3

可以说我有以下模型:

class Car < ActiveRecord::Base

attr_accessible :wheels,
                :engine_cylinders

validates :wheels, :engine_cylinders, presence: true, numericality: true

end

假设我有以下控制器操作:

@car = Car.find(params[:id])
@car.wheels = "foo"
@car.engine_cylinders = 4
@car.save

此保存将失败,因为车轮将无法满足数字条件。

有什么方法可以保留成功的属性(在本例中为 engine_cylinders),同时将无效的属性添加到错误数组中?例如,Rails 中有“软”验证吗?

4

3 回答 3

1

如果您希望绕过验证,您可以随时使用:

if @car.save
  # ...
else
  @car.save(validate: false)
end

您可能希望对此或其他任何条件有不同的条件......但这就是您一次性绕过验证的方式。

但是,这可能会破坏错误数组,因此您可以在使用以下命令后重建它save(validate: false)

@car.valid?

您还可以使用 . 一次绕过验证@car.update_attribute(:attribute, <value>)

于 2013-09-05T18:54:32.137 回答
1

您想编写一个自定义验证器

class Car < ActiveRecord::Base
  validate :wheel_range,
           :engine_cylinder_range

  def engine_cylinder_range
    flash[:notice] = "engine_cylinder was not saved because it wasn't a number" unless engine_cylinder.is_a? Fixnum
    # set engine_cylinder back to old value
  end

  def wheel_range
    flash[:notice] = "wheels was not saved because it wasn't a number" unless wheels.is_a? Fixnum
    # set wheels back to old value
  end
end

您不必flash在这里使用,您可以使用任何变量进行内部处理或重新显示。

您可能还想把这个自定义验证检查放在:before_save钩子上。使用_was魔术方法获取旧值。

于 2013-09-05T19:00:47.393 回答
0

如果您只是想知道模型是否有效而不保存它,@car.valid?则可以这样做。它还将无效属性添加到错误数组。@pdobb 已经指出了如何在保存时绕过验证。

于 2013-09-05T19:08:19.730 回答