我在本地机器上使用ruby 2.6.5。我也在heroku机器上使用相同的ruby版本。
然而,我在使用heroku时出现了一个奇怪的错误。
如果我定义了一个方法,比如:
def current_admin
@current_admin ||= 'yana'
end
它在我的机器上运行得很好,在heroku上它会引发一个NameError:
NameError (`@` is not allowed as an instance variable name)
然而,当我这样做时:
def current_admin
return @current_admin if defined?(@current_admin)
@current_admin = 'yana'
end
它在两台机器上都能工作。
究竟是什么区别导致heroku上的第一个语法失败?
*更新*
我做的差异是为了让它在heroku上工作。
def current_account
- @current_account ||= AccountSession.find
+ return @current_account if defined? @current_account
+
+ @current_account = AccountSession.find
end
我不知道Heroku故障,但下面是区别的答案。
@current_admin ||= 42
上面的行与@current_admin = @current_admin || 42
完全等效。也就是说,当@current_admin
是falsey
,也就是false
或nil
时,该值将重置为42
。
如果且仅此实例变量以前未在当前作用域中声明,@defined
将重置该值。即使nil
也会保持原样,如果它之前被明确设置的话。
defined? @current_admin
#⇒ nil
@current_admin = nil
defined? @current_admin
#⇒ "instance-variable"