【问题标题】:no implicit conversion of String into Hash (smarter_csv gem, uploading a file with an imput)没有将字符串隐式转换为哈希(smarter_csv gem,上传带有输入的文件)
【发布时间】:2018-07-24 08:36:26
【问题描述】:

我正在尝试将具有 unicode 字符的 csv 信息保存到 Rails 应用程序上的 mysql 中,

代码错误说:

ImporterController#upload 中的类型错误

没有将字符串隐式转换为哈希

问题出在这一行

@csv = SmarterCSV.process(params[:csv].tempfile, "r:bom|utf-8")

编辑 这里是日志

Started POST "/importer/upload" for 127.0.0.1 at 2018-02-14 17:46:31 +0100
Processing by ImporterController#upload as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"rnz9HzM4aKALO2By3YtSbADmdAEhW4C+iv+9XAB3JArI/B8DAYkGdrJDULCA20p+Hx2APP4yErP9YSycsGfxdA==", "csv"=>#<ActionDispatch::Http::UploadedFile:0x007fd80801c1f0 @tempfile=#<Tempfile:/tmp/RackMultipart20180214-26318-zurnez.csv>, @original_filename="got_characters.csv", @content_type="text/csv", @headers="Content-Disposition: form-data; name=\"csv\"; filename=\"got_characters.csv\"\r\nContent-Type: text/csv\r\n">, "commit"=>"Upload"}
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms)



TypeError (no implicit conversion of String into Hash):

app/controllers/concerns/character_mock.rb:46:in `import_create'
app/controllers/importer_controller.rb:6:in `upload'
  Rendering /home/marcos/.rvm/gems/ruby-2.4.0@hbo/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout

【问题讨论】:

  • 日志是什么?
  • “哈希”在哪里发挥作用?请提供SHOW CREATE TABLE和生成的SQL语句。

标签: mysql ruby-on-rails unicode utf-8 smartercsv


【解决方案1】:

解决了!

最后需要改变 MySQL 上的表以使用 utf8mb4 而不仅仅是 utf8,然后:

File.open(params[:csv].tempfile, "r:bom|utf-8") do |csv|
 chars = SmarterCSV.process(csv);
  chars.each do |char|
   #Then this will work
   Register.create(name: char[:name])
  end
 end
end

你也可以试试Register.create(name: char[:name].force_encoding("UTF-8")

似乎是 MySQL 上的一个错误导致了这种问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多