在表格HTML上打印哈希-Ruby on Rails

时间:2018-11-10 00:59:09

标签: ruby-on-rails

我有一个包含此数据的实例变量@report_antennas_control_access [{:id_control_access=>1, :input=>"Antena 1"}, {:id_control_access=>1, :output=>"Antena 2"}, {:id_control_access=>1, :input=>"Antena 5"}, {:id_control_access=>2, :input=>"Antena 3"}, {:id_control_access=>2, :output=>"Antena 4"}],我想将其打印到我的.html表中,但这样做的方式是我不希望的

我这样做:

                  <tbody>
                    <% @report_antennas_control_access.each do | antennas | %>
                      <tr>
                        <% if control_access[:id_control_access] == antennas[:id_control_access] %>
                          <td><%= antennas[:input] %></td>
                          <td><%= antennas[:output] %></td>
                        <% end %>
                      </tr>
                    <% end %>
                  </tbody>

但是他以我不想要的方式将其打印给我:

enter image description here

这是我需要打印该数据的方式(示例):

enter image description here

2 个答案:

答案 0 :(得分:3)

正如大卫已经说过的那样,在您的投入下,实现您的需求将非常困难。由于它很有趣,所以我对其进行了修复,但是我坚信应该将其修复在代码中更高的位置(我希望您使用的是Ruby 2.5+,否则请告诉我您使用的是哪个版本。)

def fix_my_data(data)
  data.group_by { |x| x[:id_control_access] }
      .transform_values do |v|
        v.map { |h| h.slice(:input, :output) }
         .group_by { |h| h.keys.first }.values.inject(:zip).map { |x,y| x.merge(y.to_h) }
      end
end

如果将数组传递给此函数,它将返回以下内容:

{1=>[{:input=>"Antena 1", :output=>"Antena 2"}, {:input=>"Antena 5"}],
 2=>[{:input=>"Antena 3", :output=>"Antena 4"}]}

使用HTML生成HTML应该非常简单,就像这样:

<tr>
  <% @data[control_access[:id_control_access]].each do |antenna| %>
    <td><%= antenna[:input] %></td>
    <td><%= antenna[:output] %></td>
  <% end %>
</tr>

我很确定fix_my_data可以用更简单的方式编写,但是正如我提到的,现在修复数据已经晚了。

答案 1 :(得分:0)

问题是您要遍历每个哈希并尝试在哈希之前或之后访问哈希中的数据。以第一个哈希为例:{:id_control_access=>1, :input=>"Antena 1"}。您在其上调用antennas[:input],因此显示“ Antena 1”。但是然后您调用antennas[:output],并且当前哈希中没有output键,因此它返回nil并使对应的表格单元格为空。

如果可以的话,您应该考虑更新哈希的结构,以使它们看起来像{:id_control_access=>1, :input=>"Antena 1", :output=>"Antena 2"}。在我看来,这更合乎逻辑,可以解决您的表问题。