2

CSVファイルを解析するためにこれがあります:

csv_file = CSV.parse(
  file.read(),
  headers:              true,
  header_converters:    :symbol
)

動作しますが、エンコーディングタイプを指定したいので{encoding: 'UTF-8'}、以下のようにreadメソッドに:を追加します。

csv_file = CSV.parse(
  file.read({encoding: 'UTF-8'}),
  headers:              true,
  header_converters:    :symbol
)

しかし、私はこのエラーを受け取ります:ハッシュを整数に変換できません

何が悪いのかわかりません。ドキュメントを確認しましたが、そのようにエンコーディングを渡すことができると書かれていますが、最初の引数としてファイルが必要なので、そこでストールする可能性がありますが、どのファイルが読み取られているかはすでにわかっているので、問題ないはずです。

どうすればこれを解決できますか?

アップデート:

私は以下に更新しました:

def import
  if params[:import_coasters]
    file = params[:import_coasters][:file]
    Park.import_from_csv(file)


def self.import_from_csv(file)
  Park.destroy_all

  csv_file = CSV.parse(
    File.read(file, {encoding: 'UTF-8'}),
    headers:              true,
    header_converters:    :symbol
  )

しかし、次のエラーが発生します。

ActionDispatch :: Http::UploadedFileを文字列に変換できません

4

2 に答える 2

4

あなたは近くにいます。これを試して:

# Step 1: convert the uploaded file object to a file name
uploaded_file = params[:import_coasters][:file]
file_name = uploaded_file.path

# Step 2: To get the input text and see if it's what you expect
text = File.read(
  file_name, 
  {encoding: 'UTF-8'}
)

# Parse the text
csv_file = CSV.parse(
  text,
  headers: true,
  header_converters: :symbol
)

IO.readのRuby1.9.3ドキュメントから:

「最後の引数がハッシュの場合、内部open()のオプションを指定します。キーは次のようになります。open_args:は他の人に排他的です。」

http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-read

UploadedFileまた、実際には典型的なRuby Fileオブジェクトではないため、のドキュメントを参照してください。

http://api.rubyonrails.org/classes/ActionDispatch/Http/UploadedFile.html

于 2012-11-25T06:24:48.020 に答える
1

これは、File.read()が最初の引数としてファイル名を予期しているためです。代わりに、ActionDispatch :: Http::UploadedFileを渡します。ドキュメントを見ると、UploadedFileにはすでにreadメソッドがあることがわかるので、次のことを試すことができます。

   csv_file = CSV.parse(
    file.read({encoding: 'UTF-8'}),
    headers:              true,
    header_converters:    :symbol
  )
于 2012-11-25T23:38:16.093 に答える