进行验证

时间:2012-07-22 14:14:01

标签: ruby-on-rails-3

我正在经历我的新项目,其中proc用于验证,我不理解。 有人可以解释一下这里发生了什么吗?我的代码在模型中是这样的

before_validation :strip_whitespace, :if => proc{|datefield|datefield.export_date_format.present?}

def strip_whitespace
  self.export_date_format.strip!
end

为什么我们在这里使用proc,为什么我们不能检查datefield.export_date_format.present?在if条件下直接调用:strip_whitespace方法? proc到底在做什么?

1 个答案:

答案 0 :(得分:0)

1.为什么不直接在方法中检查格式?也许这是设计的一部分,以保持方法和过程调用该方法或不作为两个不同的参数。 proc这里是对象,这就是为什么可以将过程作为参数传递的原因,因为proc是first class object

2.在这个地方定义程序很方便然后定义方法然后只调用一次这个方法。这就是其他语言中的匿名函数。

3.有时,这是定义只能是proc或lambda的过程的唯一方法。例如在#108 named_scope中,Ryan Bates不得不使用lambda:

lambda {|*args| {:conditions => ["released_at > ?",(args.first || 2.weeks.ago)]}}

因为在这个lambda调用时应该计算表达式2.weeks.ago,而不是在加载表达式时计算它。