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 で別の問題を抱えているようで、副作用があるかもしれません。大規模なプロジェクトではこのハックをお勧めしませんが、小さなスクリプトではうまくいくかもしれません。

于 2012-05-28T18:10:13.557 に答える
-1

String.each1.8.7 では、バイトや文字ではなく、行で動作します。1.9String.split("\n").eachでは の代わりに使用しString.eachます。ただし、末尾に「\n」がない文字列を指定する場合はsplit、区切り文字を切り捨てString.eachて「/n」で終わる文字列を指定してください。String.split("\n").each

于 2014-08-28T10:52:00.083 に答える