1

我的几个部分可以以两种“模式”呈现。如果full_displayfalse,我不会渲染多个字段。为了方便起见,我想将“模式”之一设为默认值 - 如果full_display未定义,则将其视为false. 我想出了这段代码:

(((not defined?(full_display).nil?) && full_display) || false)

有很多东西可以四处走动。将它放在帮助程序或其他东西中会很好,但由于 Ruby 只有词法范围,我想不出任何好的方法来做到这一点。

我已经尝试过的坏主意:

  • 在部分的顶部 do<% display = long code that is above %>和 use 通过代码显示,但是在视图中创建局部变量看起来很糟糕,并且必须将 using 复制到每个部分中full_display
  • 将它包装在一个字符串中,将其放入一个助手中并在视图中使用 eval(display_helper) ,但显然这会产生安全问题。
4

1 回答 1

2

这是一种非常复杂的说法,如下所示:

defined?(full_display) && full_display

在 Ruby 中,有两个值不为真,nil并且false,所有其他值都评估为 true,其中包括 0、空字符串等,否则在 Perl、PHP 和 C 中将评估为 false。测试.nil?通常保留用于那些您想要区分false和未定义的罕见情况,有时是缺少值与错误值不同的布尔字段的情况。

无论如何,在视图空间中使用或等于运算符分配默认值要容易得多,||=如下所示:

<% full_display ||= false %>

这相当于full_display = full_display || false。这有两件事。首先,full_display即使之前没有创建变量,它也会定义变量,其次,它确保它将包含一个至少false,永远不会未定义的值。

您会||= default在 Ruby 代码中看到很多这种模式,因为这是一种在其他情况下分配某些东西的简单方法nil

于 2010-11-19T17:35:46.070 回答