循环遍历数组的最佳方式

时间:2017-11-01 18:05:29

标签: ruby-on-rails

我的控制器将此数组传递给视图:

@ipd = Ipdw.connection.select_all("select * from [My Preferences]")

这是我的观看代码:

<h1>Hello, Rails</h1>
<body>

 <% @ipd.each do |ip| %>
 <p><%= ip %></p>
 <% end %>

</body>

这将显示在浏览器中:

{"Pref ID"=>1, "Source ID"=>1, "Username"=>"RS2559", "Field Name"=>"CATEGORY", "String Value"=>"IP Placemat Deliverables", "Integer Value"=>nil, "Decimal Value"=>nil, "Created Dt Tm"=>2009-08-10 03:01:36 UTC, "Update Dt Tm"=>2009-12-14 16:04:01 UTC}

{"Pref ID"=>2, "Source ID"=>1, "Username"=>"RS2559", "Field Name"=>"TYPE", "String Value"=>nil, "Integer Value"=>nil, "Decimal Value"=>nil, "Created Dt Tm"=>2009-08-10 03:01:40 UTC, "Update Dt Tm"=>2009-12-14 16:04:01 UTC}

...

我想在表格中显示"Username""Field Name"。如何在数组中循环以仅在可读的内容中显示这些列?

3 个答案:

答案 0 :(得分:5)

看起来你的查询返回了一个哈希数组。只需使用键选择您感兴趣的值:

<% @ipd.each do |ip| %>
  <p>
    <%= ip['Username'] %><br />
    <%= ip['Field Name'] %>
  </p>
<% end %>

答案 1 :(得分:3)

如下:

<h1>Hello, Rails</h1>
<body>

 <% @ipd.each do |ip| %>
  <p>
    <% ["Username", "Field Name"].each do |k| %>
      <%= ip[k] %>
    <% end %>
  </p>
 <% end %>

</body>

当然,这只会将值放在您的页面上。你可以做其他事情,比如建立一个桌子或制作子弹点等等。

这看起来像是:

<h1>Hello, Rails</h1>
<body>

  <table>
    <tr>
      <% @field_names.each do |field_name| %>
        <th>
          <%= field_name %>
        </th>
      <% end %>
    </tr>
    <% @ipd.each do |ip| %>
      <tr>
        <% @field_names.each do |field_name| %>
          <td>
            <%= ip[field_name] %>
          </td>
        <% end %>
      </tr>
    <% end %>
  </table>

</body>

这假设在你的控制器中你做了类似的事情:

@field_names = ["Username", "Field Name"]

这样,你可以在你的控制器中决定你想要的字段(以及以什么顺序),而不必使用你的html.erb文件。

如果你想在控制器中稍微提高一些标签名称,你可以这样做:

@label_mapping = {"Username"=>"User Name", "Field Name"=>"Field Name"}

然后:

<h1>Hello, Rails</h1>
<body>

  <table>
    <tr>
      <% @field_names.each do |field_name| %>
        <th>
          <%= label_mapping[field_name] %>
        </th>
      <% end %>
    </tr>
    <% @ipd.each do |ip| %>
      <tr>
        <% @field_names.each do |field_name| %>
          <td>
            <%= ip[field_name] %>
          </td>
        <% end %>
      </tr>
    <% end %>
  </table>

</body>

答案 2 :(得分:2)

可能有两种方式:

首先,您有这种数据的模型:

<% @ipd.each do |ip| %>
<p><%= ip.username %></p>
<% end %>

谢胜利: 您从外部数据库获得的数据集看起来像哈希。所以尝试这样的事情:

<% @ipd.each do |ip| %>
<p><%= ip["username"] %></p>
<% end %>

我认为第2类是你所需要的;)。

在视图中我不会使用较短的循环方式,因为代码的可读性会降低:abc.each{|letter| "<li>#{letter}</li>"}