Ruby on rails 跳过模型中的某些验证方法
我正在使用Rails v2.3 如果我有型号: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的验证在这个保
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}