2

我正在关注本教程中的第一个示例:http ://ruportbook.com/printable_documents.html ,但是我一直在为“”:String获取未定义的方法`each',我使用以下代码创建了一个新文件:

class MultiTableController < Ruport::Controller    
  stage :multi_table_report    
  class PDF < Ruport::Formatter::PDF    
    renders :pdf, :for => MultiTableController    
    build :multi_table_report do
      data.each { |table| pad(10) { draw_table(table) } }
      render_pdf
    end    
  end    
end

然后,在一个名为 workers_controller.rb 的现有控制器中,我有下一个操作:

  def index_report
    t1 = Table(%w[a b c]) << [1,2,3] << [4,5,6]
    t2 = Table(%w[a b c]) << [7,8,9] << [10,11,12]
    pdf = MultiTableController.render_pdf(:data => [t1,t2])
  end

然后,我在浏览器上收到此错误:

undefined method `each' for "1":String

我已经尝试了许多其他示例,但我得到了同样的错误。

一些帮助?

4

2 回答 2

10

each是 ruby​​ 1.8 中的一种方法,String并在 Ruby 1.9 中被删除。

原因是 Unicode,或者更好的 ruby​​ 1.9 的新编码可能性。

应该String #each怎么做?循环每个字节或每个字符?Ruby 无法为您决定,因此您必须使用String#each_byteor String#each_char

在 Ruby 1.8 中没有区别,一个字符就是一个字节。


编辑:

给一个肮脏的黑客一个机会:

class String
  alias :each :each_char
end

'aaaa'.each{|x| p x }

但是 ruport 似乎对 Ruby 1.9 有其他问题,并且可能会有副作用。我不会在更大的项目中推荐这种 hack,但它可能适用于小脚本。

于 2012-05-28T18:10:13.557 回答
-1

String.each在 1.8.7 中适用于行,而不适用于字节或字符。在 1.9 中使用String.split("\n").each而不是String.each. 但要小心,split切断分隔符,所以String.each给字符串以“/n”结尾,String.split("\n").each而给字符串结尾不带“\n”。

于 2014-08-28T10:52:00.083 回答