2017-02-04 90 views
0

enter image description here解释after_initialize如果语法


更新:错字图像):

after_initialize :set_default_role, :if => :new_record? 

所以给上面的代码,我很好奇,是有一个名字:if => :new_record?语法?

为什么if语句写成散列?

是否有区别,如果它作为书面:

after_initialize :set_default_role if self.new_record? 

回答

1

首先,在after_initialize语法是在你的代码不正确

相反的:

after_initialize: set_default_role

你应该叫

after_initialize :set_default_role


这就是说,after_initialize这里是从类体(是的,这是可能的Ruby)的通常方法调用。在加载类时,它被称为一次。这个方法在被调用时设置一个回调函数(第一个参数),在这种情况下,当你的Active Record对象被实例化时被触发)。

在这种情况下,:if是传递给after_initialize方法的关键选项。这是一样的,如果你调用这样的方法:

after_initialize(:set_default_role, { if: :new_record? }) 
  • 第一个参数:回调方法来调用。
  • 第二个参数:有一些选项的哈希对象。

    刚一说明::if => :new_record?hashrocket符号)相同if: :new_record?的(新的语法,类JSON)。

所以,if这里只是键名称作为方法调用(没有条件if关键字)的第二个参数传递的选项哈希对象的

顺便说一句,您可以阅读更多关于条件回调here


为什么after_initialize :set_default_role if self.new_record?不起作用?

这是因为该方法被调用的类主体,与类上下文(self = User,不self = @user) - 加载时一次 - 和new_record?实例方法。口译员会抛出undefined method 'new_record?'错误。

当您正确设置if:键到:new_record?时,它的作用类似于指针。你说:好了,我现在定义,因为,在时机成熟时(此活动记录对象实例化)我的课情况下,你会寻找一个叫做在我的课set_default_role实例方法,但只如果实例方法new_record?返回true

+0

感谢。那么':if'键选项**仅对于像'after_initialize'那样处理它们的特定方法有效,还是所有Ruby方法都继承的东西? – resting

+0

@resting不用客气。这对所有的[回调方法]一个选项(http://guides.rubyonrails.org/active_record_callbacks.html#conditional-callbacks)... – mrlew