【发布时间】:2011-01-24 00:56:25
【问题描述】:
我在想,在我的部分顶部,我会有这样的东西
<% optional_width = default_value unless (defined? optional_width)
但是我得到了不一致的结果,我认为这不是一个好方法。在 Rails 中执行此操作的“正确”方法是什么?
【问题讨论】:
标签: ruby-on-rails ruby
我在想,在我的部分顶部,我会有这样的东西
<% optional_width = default_value unless (defined? optional_width)
但是我得到了不一致的结果,我认为这不是一个好方法。在 Rails 中执行此操作的“正确”方法是什么?
【问题讨论】:
标签: ruby-on-rails ruby
虽然不完全等同于您的代码,但通常使用 || 运算符完成。
<% optional_width ||= default_value %>
这相当于optional_width = optional_width || default_value。由于shot-circuit evaluation,如果optional_with 为“真”,即它已定义,而不是nil,则右侧部分变为等于它,并且甚至不计算default_value。否则,右侧部分将等于default_value。这基本上就是您想要做的。
好的,我承认它可能不适用于部分本地人。我可以想象的特殊情况是,如果在第一次渲染调用中,optional_width 变量被设置为某个值,而在随后对render 的调用中,它根本没有被提及,同时保持第一次运行时的值。不过,目前无法进行此类检查。
【讨论】:
阅读ActionView::Base docs中的将局部变量传递给子模板部分
基本上它说你应该使用这种模式:
<% if local_assigns.has_key? :headline %>
Headline: <%= headline %>
<% end %>
对你来说,这可能会转化为:
<div style="width: <%= local_assigns.has_key?(:optional_width) ? optional_width : 500 %>px;">
<!-- filler -->
</div>
根据文档
使用
defined? headline进行测试将不起作用。这是一个实施限制。
【讨论】: