Ruby on rails 初始化if语法后解释
Ruby on rails 初始化if语法后解释,ruby-on-rails,ruby,Ruby On Rails,Ruby,(更新:图像输入错误): 鉴于以上代码,我很好奇:if=>:new_record?语法是否有一个名称 为什么if语句被写成散列 如果其写为: after_initialize :set_default_role if self.new_record? 首先,初始化后的语法在代码中是不正确的 而不是: 初始化后:设置默认角色 你应该打电话 初始化后:设置默认角色 也就是说,在初始化之后,这里是一个来自类主体的普通方法调用(是的,在Ruby中是可能的)。当类被加载时,它被称为。调用此方法时,将
(更新:图像输入错误):
鉴于以上代码,我很好奇
:if=>:new_record?
语法是否有一个名称
为什么if
语句被写成散列
如果其写为:
after_initialize :set_default_role if self.new_record?
首先,初始化后的
语法在代码中是不正确的
而不是:
初始化后:设置默认角色
你应该打电话
初始化后:设置默认角色
也就是说,在初始化之后,这里是一个来自类主体的普通方法调用(是的,在Ruby中是可能的)。当类被加载时,它被称为。调用此方法时,将设置回调(第一个参数),在本例中,当您的活动记录对象被实例化时,将触发该回调(第一个参数)
在这种情况下,:如果
是在初始化
方法之后传递给的关键选项。这与像这样调用方法是一样的:
after_initialize(:set_default_role, { if: :new_record? })
- 第一个参数:要调用的回调方法李>
- 第二个参数:带有一些选项的哈希对象
请注意:
:if=>:new_record?
(hashrocket符号)与if::new_record?
(新语法,类似JSON)相同
因此,if
这里只是作为方法调用的第二个参数传递的options散列对象的键名(而不是条件if
关键字)
顺便说一下,您可以阅读更多关于条件回调的信息
为什么在初始化之后:如果是self,则设置默认角色。新建记录?
不起作用?
这是因为该方法是在类主体中调用的,类上下文(self=User
,而不是self=@User
)-在加载时调用一次-new\u record?
是一个实例方法。解释器将抛出一个未定义的方法“new_record?”
错误
当您正确地将if:
键设置为:new\u record?
时,它就像指针一样工作。您的意思是:好的,我现在在我的类上下文中定义,当时间到来时(这个活动记录对象被实例化),您将在我的类实例中查找名为set\u default\u role
的方法,但前提是实例方法新记录?
返回true
,谢谢。:如果
键选项只对处理它们的特定方法有效,比如初始化后的,或者它是所有Ruby方法继承的东西?@resting欢迎您。这是所有。。。
after_initialize(:set_default_role, { if: :new_record? })