Ruby 1.87で正常に動作するが、Ruby 1.9では動作しないコードがあります。CSV:: Writerは宣言されていませんが、それでもrdoc。fastercsvマージ後、csv apiは変更されましたか?
私のコード:
require 'csv'
def self.export_csv
file_name = File.join(Rails_ROOT, 'public','csv',"#{start_date_f}_#{end_date_f}.csv")
return file_name if File.exist?(file_name)
@results = find(:all)
header_row = []
outfile = File.open(file_name, 'wb')
CSV::Writer.generate(outfile) do |csv|
header_row = ['gateway_id','created', 'gateway_status_id', 'panel_id', 'panel_status','volts_out', 'amps_out', 'temp','aid' ,'sid', 'pisid']
csv << header_row
end
end
私が受け取るエラー:NameError:初期化されていない定数CSV :: Writer
「csv」が必要であることに注意してください。コンソールで試してみました。require'csv 'を実行すると機能しますが、CSV :: Writerを呼び出すとすぐにそのエラーが発生します。このコードはRuby 1.87で正常に動作するため、fasterCSVとマージされたため、Ruby 1.9csvの問題であると思われます。
Csvライブラリはまだありますが、CSV :: Writerはありません。 1.9.0のcsv.rbによると:
# I'm sure I'll miss something, but I'll try to mention most of the major
# differences I am aware of, to help others quickly get up to speed:
#
# === CSV Parsing
#
# * This parser is m17n aware. See CSV for full details.
# * This library has a stricter parser and will throw MalformedCSVErrors on
# problematic data.
# * This library has a less liberal idea of a line ending than CSV. What you
# set as the <tt>:row_sep</tt> is law. It can auto-detect your line endings
# though.
# * The old library returned empty lines as <tt>[nil]</tt>. This library calls
# them <tt>[]</tt>.
# * This library has a much faster parser.
#
# === Interface
#
# * CSV now uses Hash-style parameters to set options.
# * CSV no longer has generate_row() or parse_row().
# * The old CSV's Reader and Writer classes have been dropped.
# * CSV::open() is now more like Ruby's open().
# * CSV objects now support most standard IO methods.
# * CSV now has a new() method used to wrap objects like String and IO for
# reading and writing.
# * CSV::generate() is different from the old method.
# * CSV no longer supports partial reads. It works line-by-line.
# * CSV no longer allows the instance methods to override the separators for
# performance reasons. They must be set in the constructor.
少し後で、行ごとに書く方法の例(および他の書き方)があります:
# === To a File
#
# CSV.open("path/to/file.csv", "wb") do |csv|
# csv << ["row", "of", "CSV", "data"]
# csv << ["another", "row"]
# # ...
# end