Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 初始化if语法后解释_Ruby On Rails_Ruby - Fatal编程技术网

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? })