首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >'html-table‘创业板和HTML::Table::Head的问题

'html-table‘创业板和HTML::Table::Head的问题
EN

Stack Overflow用户
提问于 2016-06-09 18:43:14
回答 1查看 75关注 0票数 0

我正在创建两个HTML表。第一张是完美的,第二张和第一张桌子的脑袋是一样的,不管我做什么。

下面是有问题的代码:

代码语言:javascript
复制
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的结果

代码语言:javascript
复制
<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的结果

代码语言:javascript
复制
<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在两个表中看起来都是一样的。为什么?

编辑:我已经将初始代码简化了一点:

代码语言:javascript
复制
`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显示,两个变量存储相同的实例object>。

代码语言:javascript
复制
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>">]]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-09 22:47:06

直到现在,我还没有意识到这个宝石,我也不明白为什么有人会想把它添加到他的代码库中。它能增加什么价值?如果没有宝石,你能做些什么?

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

代码语言:javascript
复制
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),那么很明显,这是有意的行为:

代码语言:javascript
复制
  # 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>是一个单例,应该只存在一次

没有进一步研究这个库和它是如何工作的: IMHO将<thead>作为一个单独的实例来处理是完全错误的,并且是立即停止使用这个库的一个理由。如果你好奇的话,你可以联系作者。

经验法则是:当存在类级变量(@@)时,就会出现麻烦。

那你能做什么?

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

  • 使用再培训局:http://ruby-doc.org/stdlib-2.3.1/libdoc/erb/rdoc/ERB.html
  • HTML是“仅仅是XML (tm)”,所以您可以使用REXML:http://ruby-doc.org/stdlib-1.9.3/libdoc/rexml/rdoc/REXML.html

这两者都是“内置”解决方案。现在就可以在你的Ruby里找到。但是你也可以使用一种不同的模板解决方案(haml,瘦,.)或者,因为REXML接口不是最简单的,我认为是另一个XML生成器(ox、oga、nokogiri)或builder/xml。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37733857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档