我对Ruby很新,所以我希望我错过了一些明显的东西。我有一个表单的应用程序,使用类似的东西进行验证...
module FormValidations
extend ActiveSupport::Concern
included do
validates :field_1, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }
validates :field_2, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }
validate :field_sec, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }
def field_sec
(*some custom stuff*)
end
......依此类推,效果很好。
我现在有一种新类型的表单,它使用相同的模型和数据库结构,但有一些设置为不同的东西。它还经历了完全不同的验证过程。我一直试图找到一种方法,所以让验证调用成为有条件的,比如......
included do
validate :form_switch, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }
def form_switch
#This uses a method I defined in the model to tell which form is active
if is_special_form == true
validates :field_245, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }
validates :field_432, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }
else
validates :field_1, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }
validates :field_2, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }
end
end
...但是"验证"放置在方法内部时抛出错误。
我还想到了将两个单独的验证脚本文件包含在我的表单模型中的想法,但由于该过程是使用简单的" .valid?"方法,我不知道如何区分该级别的脚本。
有没有办法使用单一模型在两组(或多组)验证之间切换?
答案 0 :(得分:1)
您可以有条件地进行所有验证。我认为没有必要把所有东西都塞得这么深。由于包含块的内容将在模型类的上下文中执行,因此应该可以:
included do
validates :field_245, :if => :validate_field_245?
validates :field_432, :if => :validate_field_432?
validates :field_1, :if => :validate_field_1?
validates :field_2, :if => :validate_field_2?
def validate_field_245?
is_special_form && stage == APPLICATION_STAGE[:DATA_ENTRY]
end
def validate_field_432?
is_special_form && stage == APPLICATION_STAGE[:DATA_ENTRY]
end
def validate_field_1?
!is_special_form && stage == APPLICATION_STAGE[:DATA_ENTRY]
end
def validate_field_2?
!is_special_form && stage == APPLICATION_STAGE[:DATA_ENTRY]
end
end
一旦您发现自己有条件地使用不同的验证,就应该考虑using form objects来处理验证逻辑。 simple_form和reform库可以轻松实现。