在Rails中制作动态范围助手

时间:2010-11-19 17:25:28

标签: ruby-on-rails ruby scope helper dynamic-scope

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

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

四处走动很多。将它放在帮助器或其他东西中会很好,但由于Ruby只有词法范围,所以我想不出任何好的方法。

我已经尝试过的坏主意:

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

1 个答案:

答案 0 :(得分:2)

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

defined?(full_display) && full_display

在Ruby中有两个非真值的值,nilfalse,所有其他值都为true,其中包括0,空字符串等,否则将在其中评估为false Perl,PHP和C. .nil?的测试通常保留用于那些你想要区分false和未定义的罕见情况,有时这种情况就是布尔字段,其中缺失值不同来自虚假的价值。

在任何情况下,在视图空间中使用or-equals运算符||=分配默认值要容易得多:

<% full_display ||= false %>

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

你会在Ruby代码中看到很多||= default模式,因为它是一种简单的方法来分配某些东西,否则它将是nil