为什么使用Proc.new来调用Rails回调中的方法?

时间:2011-03-01 22:32:31

标签: ruby-on-rails ruby proc-object

在RoR的所有教程中,我看到编码器选择使用Proc.new的实例,看似它既不必要又缺乏吸引力。

示例,这里是放置在模型中的回调,一个使用Proc.new,另一个可能做同样的事情:

class Order < ActiveRecord::Base  
  before_save :normalize_card_number,  
    :if => Proc.new { |order| order.paid_with_card? }  
end

class Order < ActiveRecord::Base
  before_save :normalize_card_number, :if => "paid_with_card?"
end

那有什么区别?为什么要使用Proc?他们俩都不叫“paid_with_card”吗?方法

提前致谢

2 个答案:

答案 0 :(得分:15)

在上面的示例中,使用条件方法的符号可能是最佳选择。

class Order < ActiveRecord::Base
  before_save :normalize_card_number, :if => :paid_with_card?
end

string选项使用eval来评估字符串中的Ruby代码。所以个人而言,如果在编写短内联条件时调用方法或者Proc,我更愿意使用符号。

根据RailsGuides documentation

  

使用Proc对象可以编写内联条件而不是单独的方法。此选项最适合单行。

我认为使用Proc可能会用这种方式更好地说明:

class Order < ActiveRecord::Base
  before_save :normalize_card_number,
    :if => Proc.new { |order| order.payment_type == "card" }
end

这可能会消除对paid_with_card的需求吗?方法

答案 1 :(得分:2)

我要说的是,在旧版本的Rails中我们曾经是这样做的,有人添加了一个功能,你可以传递一个字符串作为当前模型的实例方法进行评估。

在简单的场景中,它使旧样式变得多余,但允许使用Proc来处理更复杂的“if”语句,这些语句只能在当前实例上使用方法来实现。