'html-table'gem和HTML :: Table :: Head

时间:2016-06-09 18:43:14

标签: ruby html-table

我正在创建两个HTML表。第一个是完美的,第二个与第一个表具有相同的HEAD,无论我做什么。

这是有问题的代码:

require 'html/table'
include HTML

title1 = [1,2,3]
data1  = [1,2,3]

table1 = HTML::Table.new
table1.push Table::Head.create{ |row| row.content = title1 }
data1.each { |entry| table1.push Table::Row.new{|row| row.content = entry}}

title2 = [1,2]
data2  = [1,2]

table2 = HTML::Table.new
table2.push Table::Head.create{ |row| row.content = title2}
data2.each { |entry| table2.push Table::Row.new{ |row| row.content = entry}
}

这是puts table1.html

的结果
<table>
   <thead>
   <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
   </tr>
   </thead>
   <tr>
      <td>1</td>
   </tr>
   <tr>
      <td>2</td>
   </tr>
   <tr>
      <td>3</td>
   </tr>
</table>

这是puts table2.html

的结果
<table>
   <thead>
   <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
   </tr>
   </thead>
   <tr>
      <td>1</td>
   </tr>
   <tr>
      <td>2</td>
   </tr>
</table>

内容没有问题,但HEAD在两个表中看起来都一样。为什么呢?

编辑: 我稍微简化了初始代码:

`require 'html/table'
include HTML
s= Table::Head.create{ |row| row.content = 1 }
m= Table::Head.create{ |row| row.content = 2 }

puts s
<td>1</td>

puts m
<td>1</td>`

puts .inspect显示两个变量都存储相同的实例对象&gt;

puts s.inspect
puts m.inspect

[[#<HTML::Table::Row::Data:0x007ff52b096e38 @html_begin="<td", @html_body="1", @html_end="</td>">]] 
[[#<HTML::Table::Row::Data:0x007ff52b096e38 @html_begin="<td", @html_body="1", @html_end="</td>">]]

1 个答案:

答案 0 :(得分:0)

直到现在我还没有意识到这个宝石,我不明白为什么有人想要将它添加到他的代码库中。它增加了什么价值?你用无法实现的宝石完成了什么?

您看到相同输出的原因是因为它是从create返回的同一个对象

require 'html/table'
include HTML
s = Table::Head.create{ |row| row.content = 1 }
m = Table::Head.create{ |row| row.content = 2 }

puts s.object_id == m.object_id # => true

如果您查看源代码(https://github.com/djberg96/html-table/blob/master/lib/html/head.rb#L18),那么很明显这是预期的行为:

  # This is our constructor for Head objects because it is a singleton
  # class.  Optionally, a block may be provided.  If an argument is 
  # provided it is treated as content.
  #
  def self.create(arg=nil, &block)
     @@head = new(arg, &block) unless @@head
     @@head
  end   

根据此代码和评论,<thead>是单身,只应存在一次

无需进一步查看库及其工作原理:将<thead>视为单身的恕我直言是完全错误的,并且有理由立即停止使用此库。如果您好奇,可以联系作者。

根据经验:当有类级变量(@@)时,就会出现问题。

那你能做什么?

您需要在像Rails这样的Web框架之外创建HTML表吗?你可以:

这些都是“内置”解决方案。立即在您的Ruby中提供。但你也可以使用不同的模板解决方案(haml,slim,......),或者因为REXML接口不是我认为最直接的,另一个XML生成器(ox,oga,nokogiri)或builder / xml。