如何使用参数验证“ifs”(Ruby on Rails)

时间:2009-10-26 14:39:55

标签: ruby-on-rails validation

对于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中,也可以使用方法的名称,但作为符号。我无法想象如何将参数传递给它。

2 个答案:

答案 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

您的验证在您的模型中执行,该模型已使用您的所有表单数据进行实例化 您可以直接访问它们。无需将它们作为参数传递。