我正在创建两个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>">]]
答案 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。