Ruport - 未定义的方法`each'表示“”:String

时间:2012-05-28 18:06:19

标签: ruby-on-rails ruby ruby-on-rails-3 reporting ruport

抱歉我的英语。

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

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

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

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

undefined method `each' for "1":String

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

有些帮助吗? 请提前! 问候。

2 个答案:

答案 0 :(得分:9)

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| p x }

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

答案 1 :(得分:-1)

1.8.7中的

String.each适用于行,而不是字节或字符。 在1.9中使用String.split("\n").each而不是String.each。但要小心,split切断分隔符,因此当String.each给出没有&#34; \ n&#34的字符串时,String.split("\n").each给字符串结束&#34; / n&#34; ;结束。