渲染部分N次而不是数组中的每个项目

时间:2013-12-11 17:03:31

标签: ruby-on-rails ruby

我有一组属于产品的属性,例如:name:smalls:mediums:larges:price等。

:smalls:mediums:larges是字符串数组:

@products = [
  { :id => 1,
    :name     => 'Product 1',
    :description => 'description goes here',
    :smalls   => ['S'],
    :mediums  => ['M','M'],
    :larges   => ['L',],
    :price    => 50.0,
    :names_and_numbers => 'optional'
  }
]

每个数组中的字符串数决定了相应部分的呈现次数:

<div id="small-field-set">
<% product[:smalls].each do |small| %>
  <%= render :partial => 'small', :locals => { :product => product, :small => small } %>
<% end %>
</div>

<div id="medium-field-set">
<% product[:mediums].each do |medium| %>
  <%= render :partial => 'medium', :locals => { :product => product, :medium => medium } %>
<% end %>
</div>

<div id="large-field-set">
<% product[:larges].each do |large| %>
  <%= render :partial => 'large', :locals => { :product => product, :large => large } %>
<% end %>
</div>

如何使用数字而不是数组的大小来确定部分渲染的次数?

我试过这样做:

{ ...
  :smalls   => [1],
  :mediums  => [2],
  :larges   => [1],
  ...
}

但那没用。

2 个答案:

答案 0 :(得分:2)

当你这样做时......

{ ...
  :smalls => [1],
  ...
}

...你仍然有一个数组:[1]是一个包含一个元素的数组,整数1(就像[1, 2]是一个包含两个元素的数组)。首先,你要摆脱数组:

{ ...
  :smalls   => 1,
  :mediums  => 2,
  :larges   => 1,
  ...
}

对于您的观点,当您使用each时,您会说,“对阵列中的每个项目执行此操作一次。”既然你现在有一个数字,而不是一个数组,你可以使用times,就像听起来一样,意味着“做N次”:

<div id="small-field-set">
<% product[:smalls].times do %>
  <%= render :partial => 'small', :locals => { :product => product, :small => "S" } %>
<% end %>
</div>

P.S。我不确定:small哈希中:locals的目的是什么。因为你的部分被称为'small'我猜你不需要这个,或者可以很容易地改变你的部分来摆脱它。

答案 1 :(得分:1)

为什么是阵列?

:smalls => 1,

然后

<% product[:smalls].times %>
  <%= render :partial => 'small', :locals => {:product => product } %>
<% end %>