示例,这里是放置在模型中的回调,一个使用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”吗?方法
提前致谢
答案 0 :(得分:15)
在上面的示例中,使用条件方法的符号可能是最佳选择。
class Order < ActiveRecord::Base
before_save :normalize_card_number, :if => :paid_with_card?
end
string选项使用eval来评估字符串中的Ruby代码。所以个人而言,如果在编写短内联条件时调用方法或者Proc,我更愿意使用符号。
使用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”语句,这些语句只能在当前实例上使用方法来实现。