如何在rails中的部分模板中有可选的局部变量?

时间:2010-03-05 08:57:06

标签: ruby-on-rails ruby

我在想,在我偏爱的顶端,我会有类似的东西

<% optional_width = default_value unless (defined? optional_width) 

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

2 个答案:

答案 0 :(得分:23)

阅读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进行测试无效。这是一个实施限制。

答案 1 :(得分:3)

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

<%  optional_width ||= default_value  %>

这相当于optional_width = optional_width || default_value。由于shot-circuit evaluation,如果optional_with为“true”,即它已定义,而不是nil,则右侧部分与之相等,default_value不均匀计算。否则,右手部分将等于default_value。这基本上就是你想要做的。

好的,我承认它可能对部分本地人不起作用。我可以想象的特殊情况是,如果在第一次渲染调用中optional_width变量被设置为某个值,并且随后调用render,则在保持其第一个值时根本没有提到它跑。但是现在不能做这样的检查。