Rails:循环遍历数组以创建部分并访问该项目

时间:2013-10-29 06:07:59

标签: ruby-on-rails ruby-on-rails-4

使用rails,我如何遍历控制器中定义的数组,为每个项创建一个部分,并访问部分中每个项的值?

控制器

为我的“grapher”页面定义一个数组:

class StaticPagesController < ApplicationController
  def home
  end

  def grapher
    @available_graphs = ["pie.png", "line.png", "lineplusbar.png"]
  end
end

页面查看

在我的grapher.html.erb视图中,我想遍历我的数组并为每个项目创建一个部分。

<%= render :partial => 'graphPreviewItem', :collection => @available_graphs %>

部分视图

如何访问部分内部的数组项?

<div class="thumbnailContainer">
    <a class="thumbnail" href="#">
        <%= image_tag "this should be the array item value" %>
    </a>
</div>

4 个答案:

答案 0 :(得分:3)

来自documentation

  

当使用复数集合调用partial时,partial的各个实例可以通过以partial命名的变量来访问正在呈现的集合的成员。在这种情况下, partial是_product,在_product partial中,您可以引用product来获取正在呈现的实例。

所以在你的情况下(请注意,在ruby命名约定中我们使用蛇形部分名称):

<%= render :partial => 'graph_preview_item', :collection => @available_graphs %>

# _graph_preview_item.html.erb
<div class="thumbnailContainer">
    <a class="thumbnail" href="#">
        <%= image_tag graph_preview_item %>
    </a>
</div>

或者,更明确地说,您可以使用:as选择您喜欢的名称。 像这样:

<%= render :partial => 'graph_preview_item', :collection => @available_graphs, :as => :graph %>

# _graph_preview_item.html.erb
<div class="thumbnailContainer">
    <a class="thumbnail" href="#">
        <%= image_tag graph %>
    </a>
</div>

答案 1 :(得分:1)

所以有两种方法: -

1)只需访问available_graph

即可
# _graph_preview_item.html.erb
<div class="thumbnailContainer">
  <a class="thumbnail" href="#">
    <%= image_tag available_graph %>
  </a>
</div>

2)您可以使用as选项通过其他名称

访问它
<%= render :partial => 'graphPreviewItem', :collection => @available_graphs, :as => :graph %>

然后按名称graph

访问它
# _graph_preview_item.html.erb
<div class="thumbnailContainer">
  <a class="thumbnail" href="#">
    <%= image_tag graph %>
  </a>
</div>

答案 2 :(得分:1)

根据规范Rails指南的section 3.4.4

  

要在partial中使用自定义局部变量名,请在调用partial时指定:as选项。通过此更改,您可以访问集合的实例作为partial中的[a]局部变量。

因此,将您的@available_graphs实例变量作为集合传递给您的部分。部分将为您的集合中的每个成员呈现(在您的情况下,是一个字符串数组)。在每个部分内,迭代的集合成员可通过item局部变量访问:

# grapher.html.erb
<%= render :partial => 'graph_preview_item', :collection => @available_graphs, :as => :item %>

# _graph_preview_item.html.erb
<div class="thumbnailContainer">
    <a class="thumbnail" href="#">
        <%= image_tag item %>
    </a>
</div>

答案 3 :(得分:0)

<%= render :partial => 'graphPreviewItem', :collection => @available_graphs, :as => image_val %> 

<div class="thumbnailContainer">
    <a class="thumbnail" href="#">
        <%= image_tag image_val %>
    </a>
</div>