【问题标题】:Ruport - undefined method `each' for "":StringRuport - "":String 的未定义方法“每个”
【发布时间】:2012-05-28 18:06:19
【问题描述】:

我正在关注本教程中的第一个示例: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

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

一些帮助?

【问题讨论】:

  • 你能说明发生了什么字符串错误吗?看起来这段代码不像在String上直接使用each
  • 如您所见,错误发生在“1”字符串,我更改了 t1 = Table(%w[a b c])

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


【解决方案1】:

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,但它可能适用于小脚本。

【讨论】:

  • 抱歉,我不认识 Ruport。但是在missing ruby 1.9.2 support 和 [ruby talk}(ruby.11.n6.nabble.com/ruport-in-ruby1-9-td3381908.html) 上有一个报告,我发现 Ruport 1.x 永远不会与 Ruby 1.9 兼容,除非其他人完成这项工作,但 Ruport 2 会 i> - 但我没有找到 Ruport 2。另请参阅我更改的答案。
  • 您好,hack 效果很好,但我现在收到其他错误:“没有为类 Mutex 定义 marshal_dump”我认为最好为我的报告搜索另一个选项,谢谢...!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多