Ruport-“”的未定义方法“每个”:字符串

问题描述 投票:1回答: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

我尝试了许多其他示例,但遇到相同的错误。

有帮助吗?

ruby-on-rails ruby ruby-on-rails-3 reporting ruport
2个回答
9
投票

[each是红宝石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| p x }

但是ruport在Ruby 1.9中似乎还有其他问题,可能会有副作用。我不建议在更大的项目中使用此技巧,但也许可以在小型脚本中使用。


-1
投票

String.each在1.8.7中适用于行,不适用于字节或字符。在1.9中,请使用String.split("\n").each代替String.each。但是请注意,split会切断定界符,因此,当String.each给出结尾不带“ \ n”的字符串时,String.split("\n").each给出以“ / n”结尾的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.