【问题标题】:How to have an optional local variable in a partial template in rails?如何在rails的部分模板中有一个可选的局部变量?
【发布时间】:2011-01-24 00:56:25
【问题描述】:

我在想,在我的部分顶部,我会有这样的东西

<% optional_width = default_value unless (defined? optional_width) 

但是我得到了不一致的结果,我认为这不是一个好方法。在 Rails 中执行此操作的“正确”方法是什么?

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

虽然不完全等同于您的代码,但通常使用 || 运算符完成。

<%  optional_width ||= default_value  %>

这相当于optional_width = optional_width || default_value。由于shot-circuit evaluation,如果optional_with 为“真”,即它已定义,而不是nil,则右侧部分变为等于它,并且甚至不计算default_value。否则,右侧部分将等于default_value。这基本上就是您想要做的。

好的,我承认它可能不适用于部分本地人。我可以想象的特殊情况是,如果在第一次渲染调用中,optional_width 变量被设置为某个值,而在随后对render 的调用中,它根本没有被提及,同时保持第一次运行时的值。不过,目前无法进行此类检查。

【讨论】:

【解决方案2】:

阅读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 进行测试将不起作用。这是一个实施限制。

【讨论】:

    猜你喜欢
    • 2011-01-04
    • 2019-07-22
    • 2011-05-18
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多