我一直是个坏孩子,在我的局部模板中使用以下语法来设置局部变量的默认值,如果一个值没有显式地定义在:locals散列中,当呈现局部——时

<% foo = default_value unless (defined? foo) %>

这似乎工作得很好,直到最近(不知道为什么我能看出),未传递的变量开始表现得好像它们被定义为nil(而不是未定义)。

正如SO上许多乐于助人的人指出的那样,http://api.rubyonrails.org/classes/ActionView/Base.html说不要使用

defined? foo

而是使用

local_assigns.has_key? :foo

我正试图改变我的方式,但这意味着要改变很多模板。

我可以/应该直接在所有模板中进行这种更改吗?有什么诡计需要我注意吗?我需要多努力地测试每一个?


当前回答

这是巴勃罗答案的导数。这允许我设置一个默认值('full'),最后,在local_assign和一个实际的本地变量中设置'mode'。

哈姆尔/苗条:

- mode ||= local_assigns[:mode] = local_assigns.fetch(:mode, 'full')

erb:

<% mode ||= local_assigns[:mode] = local_assigns.fetch(:mode, 'full') %>

其他回答

如何

<% foo ||= default_value %>

这是说“如果它不是nil或true,请使用foo。否则将default_value赋值给foo"

我认为一个更好的选择是允许多个默认变量:

<% options = local_assigns.reverse_merge(:include_css => true, :include_js => true) %>
<%= include_stylesheets :national_header_css if options[:include_css] %>
<%= include_javascripts :national_header_js if options[:include_js] %>

这是巴勃罗答案的导数。这允许我设置一个默认值('full'),最后,在local_assign和一个实际的本地变量中设置'mode'。

哈姆尔/苗条:

- mode ||= local_assigns[:mode] = local_assigns.fetch(:mode, 'full')

erb:

<% mode ||= local_assigns[:mode] = local_assigns.fetch(:mode, 'full') %>

我是这样做的:

<% some_local = default_value if local_assigns[:some_local].nil? %>

更直观、紧凑:

<% some_local = default_value除非local_assign [:some_local] %>