(更新:错字图像):
after_initialize :set_default_role, :if => :new_record?
所以给上面的代码,我很好奇,是有一个名字:if => :new_record?
语法?
为什么if
语句写成散列?
是否有区别,如果它作为书面:
after_initialize :set_default_role if self.new_record?
(更新:错字图像):
after_initialize :set_default_role, :if => :new_record?
所以给上面的代码,我很好奇,是有一个名字:if => :new_record?
语法?
为什么if
语句写成散列?
是否有区别,如果它作为书面:
after_initialize :set_default_role if self.new_record?
首先,在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
。
感谢。那么':if'键选项**仅对于像'after_initialize'那样处理它们的特定方法有效,还是所有Ruby方法都继承的东西? – resting
@resting不用客气。这对所有的[回调方法]一个选项(http://guides.rubyonrails.org/active_record_callbacks.html#conditional-callbacks)... – mrlew