Ruby on rails 跳过模型中的某些验证方法

Ruby on rails 跳过模型中的某些验证方法,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-3.1,Ruby On Rails,Ruby On Rails 3,Ruby On Rails 3.1,我正在使用Rails v2.3 如果我有型号: class car < ActiveRecord::Base validate :method_1, :method_2, :method_3 ... # custom validation methods def method_1 ... end def method_2 ... end def method_3 ... end end 我想跳过方法\u 2的验证在这个保

我正在使用Rails v2.3

如果我有型号

class car < ActiveRecord::Base

  validate :method_1, :method_2, :method_3

  ...
  # custom validation methods
  def method_1
    ...
  end

  def method_2
    ...
  end

  def method_3
    ...
  end
end

我想跳过
方法\u 2的验证
在这个保存新车的特殊方法中,如何跳过特定的验证方法?

条件验证的基本用法是:

class Car < ActiveRecord::Base

  validate :method_1
  validate :method_2, :if => :perform_validation?
  validate :method_3, :unless => :skip_validation?

  def perform_validation?
    # check some condition
  end

  def skip_validation?
    # check some condition
  end

  # ... actual validation methods omitted
end
class-Car:执行\u验证?
验证:方法3,:除非=>:跳过验证?
是否执行def_验证?
#检查一些情况
结束
def跳过\u验证?
#检查一些情况
结束
# ... 省略了实际验证方法
结束
查看文档了解更多详细信息

将其调整到您的屏幕:

class Car < ActiveRecord::Base

  validate :method_1, :method_3
  validate :method_2, :unless => :flag?

  attr_accessor :flag

  def flag?
    @flag
  end    

  # ... actual validation methods omitted
end

car = Car.new(...)
car.flag = true
car.save
class-Car:标志?
属性存取器:标志
def标志?
@旗
结束
# ... 省略了实际验证方法
结束
车=车。新的(…)
car.flag=true
汽车救援

根据天气标志是否为真或假,使用方法
保存(假)
跳过验证。

将您的模型更新到此状态

class Car < ActiveRecord::Base

  # depending on how you deal with mass-assignment
  # protection in newer Rails versions,
  # you might want to uncomment this line
  # 
  # attr_accessible :skip_method_2

  attr_accessor :skip_method_2 

  validate :method_1, :method_3
  validate :method_2, unless: :skip_method_2

  private # encapsulation is cool, so we are cool

    # custom validation methods
    def method_1
      # ...
    end

    def method_2
      # ...
    end

    def method_3
      # ...
    end
end
如果通过控制器中的params变量获取
:flag
,则可以使用

def save_special_car
   new_car=Car.new(skip_method_2: params[:flag].present?)
   new_car.save
end

在验证中使用块,例如:

validates_presence_of :your_field, :if =>  lambda{|e| e.your_flag ...your condition}

您的“特种车”是否具有任何可以将其与非特种车区分开来的属性?这就简单了。你看过文档了吗?嗨,我更新了我的帖子,找到了拯救一辆特殊汽车的方法。基本上,我有一个“flag”参数传递给方法,如果“flag”为真,我想跳过方法_2@Dave的验证,我已经讨论过了。但我想实现的是在方法级别,我想知道是否有可能在方法级别实现它,以及如何实现。实际上,flag不是基于DB的属性…所以…还有其他方法吗?
save(false)
将跳过整个验证,而不仅仅是一个方法。它也是
save(validate:false)
,而不是
save(false)
Rails v2.3中的
save(false)
attr\u writer
应该是
attr\u accessor
,否则会出现
未定义的局部变量或方法“skip\u method”
错误。或者你也可以编写自己的阅读器函数,比如
skip\u method?
。谢谢你的回答。我为此搜索了很多。对于其他可能遇到此问题的人,我认为如果你这样做,你会得到一个消息分配错误。您可以这样做来避免错误:
new\u car=car.new
new\u car.skip\u method\u 2=params[:flag]。演示?
@lnreddy感谢您指出质量分配错误。我已经将答案更新为更新的Rails版本。
def save_special_car
   new_car=Car.new(skip_method_2: params[:flag].present?)
   new_car.save
end
validates_presence_of :your_field, :if =>  lambda{|e| e.your_flag ...your condition}