2015-03-03 30 views
3

我注意到几乎所有的人都使用Proc.new而不是lambda(我猜是因为它关心/不关心arity),并且通常也会传递当前实例作为论据。不过,我检查了它,也没有| instance |作为参数传递。在网上看到,似乎我应该写在有条件的回调块(lambda或Proc)中跳过实例

before_save :do_something, if: Proc.new { |instance| instance.associated_objects.empty? } 

是不是有什么毛病我例如使用上找到下面

class SomeModel < ActiveRecord::Base 
    has_many :associated_objects 

    before_save :do_something, if: -> { associated_objects.empty? } 
end 

据官方指南和大多数职位的例子 - >并没有参数?这与在模型代码中使用self.some_method并使用隐式接收器跳过接收器类似。

+0

我的回答有帮助吗? – Anthony 2015-03-05 13:03:02

+0

是的,我继续使用我在第一篇文章中展示的简短版本 – januszm 2015-03-09 14:52:34

回答

3

您已经明白了,Proc或lambda中评估的范围会自动设置为您要保存的对象的当前实例。

rails docs你可以看到,如果你想定义你自己的回调,你可以选择使用Proc或lambda与范围内的对象。

如果给出了一个proc,lambda或block,它的主体将在当前对象的 上下文中求值。它也可以选择接受当前对象作为参数。

我觉得很有意思的是,Rails Guides建议通过在当前情况下进入PROC时(如你所述)是很常见的地方,离开这个信息出来别处时self是隐含的。