Ruport – 未定义的方法`each’表示“”:String

对不起我的英语不好。

我正在关注这个tuto: http: //ruportbook.com/printable_documents.html,第一个例子,但我得到未定义的方法`每个’为“”:字符串一直,我用这段代码创建了一个新文件:

class MultiTableController < Ruport::Controller stage :multi_table_report class PDF  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[abc]) << [1,2,3] << [4,5,6] t2 = Table(%w[abc]) << [7,8,9] < [t1,t2]) end 

我当然把这条路线添加到routes.rb。

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

 undefined method `each' for "1":String 

但错误不仅发生在这个例子中,我已经尝试了许多其他例子,我得到了同样的错误。

一些帮助? 请提前! 问候。

each都是ruby 1.8中String一个方法,它在Ruby 1.9中删除了。

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

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

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


编辑:

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

 class String alias :each :each_char end 'aaaa'.each{|x| px } 

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

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