我在本地计算机上使用ruby 2.6.5。我还在heroku机器上使用了相同的红宝石版本。
但是我在使用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
答案 0 :(得分:3)
我对Heroku的毛刺一无所知,但以下是区别的答案。
@current_admin ||= 42
上面的行与@current_admin = @current_admin || 42
完全等效。就是说,当42
为@current_admin
(又名falsey
或false
时,该值将重置为nil
。
@defined
将重置值,并且仅当此实例变量先前未在当前范围内声明时。即使nil
也会像以前明确设置的那样保持原样。
defined? @current_admin
#⇒ nil
@current_admin = nil
defined? @current_admin
#⇒ "instance-variable"