我在 Rails 视图部分的开头有这个:
<% enabled = true unless defined?(enabled) %>
enabled
这是通过设置默认值来处理调用视图未传入本地的情况。
但enabled
不会设置为真。
我知道这个结构enabled ||= true
,但我不能在这里使用它,因为传入的值可能是false
. 那将被覆盖true
。
我在 Rails 视图部分的开头有这个:
<% enabled = true unless defined?(enabled) %>
enabled
这是通过设置默认值来处理调用视图未传入本地的情况。
但enabled
不会设置为真。
我知道这个结构enabled ||= true
,但我不能在这里使用它,因为传入的值可能是false
. 那将被覆盖true
。
这修复了它:
<%
unless defined?(enabled)
enabled = true
end
%>
由于 ruby 解析器的工作方式,这似乎正在发生。
问题中的后缀条件出现在赋值代码之后,我认为解析器导致变量以一个nil
值出现,使defined?
返回为假。
请参阅此 ruby 论坛帖子。
defined?
通过与 OR 运算符结合使用,您可以实现与您最初尝试做的类似的效果||
:
defined?(enabled) || enabled = true
例子:
2.4.4 :001 > enabled
NameError: undefined local variable or method `enabled' for main:Object
from (irb):1
...(etc.)
2.4.4 :002 > defined?(enabule) || enabled = true
=> true
2.4.4 :003 > enabled
=> true
2.4.4 :004 > enabled = false
=> false
2.4.4 :005 > defined?(enabule) || enabled = true
=> true
2.4.4 :006 > enabled
=> true