对于Rails中的条件验证,我可以这样做:
mailed_or_faxed_agenda = Proc.new { |me| me[:agenda_mailed_faxed] }
validates_presence_of :agenda, :if=>!mailed_or_faxed_agenda
但我不知道如何参数化Proc。我很乐意使用if=>blah(name)
,但我无法弄清楚如何使用它。有什么想法吗?
注意:在这些ifs中,也可以使用方法的名称,但作为符号。我无法想象如何将参数传递给它。
答案 0 :(得分:2)
通过“参数化Proc”,你的意思是说好吗?
或者只是这个?
my_proc = Proc.new { |chunky| do stuff to 'chunky' here }
my_proc.call("bacon") # "bacon" is "chunky" in the above proc
第二个问题(向方法发送参数),你可以这样做:
validates_presence_of :some_column_name
:if => Proc.new { |model_instance| model_instance.send(:some_method, arg1, arg2, arg3) }
<强>更新强>
如果您不想参数化调用的方法,可以简化上述操作。以下相当于将文字符号传递给send
:
validates_presence_of :some_column_name
:if => Proc.new { |model_instance| model_instance.some_method(arg1, arg2, arg3) }
答案 1 :(得分:1)
基于documentation,您可以在:if参数中使用proc。
validates_presence_of :agenda,
:if => Proc.new { |me| me[:agenda_mailed_faxed] }
您还可以通过执行方法和passing it's name as a symbol来避免使用该过程。
def mailed_or_faxed
# Your method logic
end
validates_presence_of :agenda,
:if => :mailed_or_faxed
如果您不能提供任何参数。但这没有必要 您可以访问验证方法中的所有模型数据。
例如,如果您想在验证中检查 agenda_mailed_faxed 布尔形式值,执行以下操作将完美起作用:
validates_presence_of :agenda,
:if => :agenda_mailed_faxed
您的验证在您的模型中执行,该模型已使用您的所有表单数据进行实例化 您可以直接访问它们。无需将它们作为参数传递。