使用put时文件未填充

时间:2019-01-24 08:57:59

标签: ruby-on-rails ruby

我正在尝试从CSV创建Rails区域设置文件。创建文件并正确解析了CSV,但未填充文件。我没有错误,所以我不知道怎么了...

这是我的代码:

draw_tile

# frozen_string_literal: true class FillLanguages require 'csv' def self.get result = [] file = File.new('config/locales/languages.yml', 'w') CSV.foreach('lib/csv/BCP-47_french.csv', headers: false, col_sep: ';') do |row| result.push(row[0]) hash = {} key = row[0] hash[key] = row[1] file.puts(hash.to_yaml) end result end end 返回

Rails.logger.debug(hash)

符合预期。

{"af-ZA"=>"Africain (Afrique du Sud)"} {"ar-AE"=>"Arabe (U.A.E.)"} {"ar-BH"=>"Arabe (Bahreïn)"} {"ar-DZ"=>"Arabe (Algérie)"} {"ar-EG"=>"Arabe (Egypte)"} {"ar-IQ"=>"Arabe (Irak)"} ... 返回

Rails.logger.debug(hash.to_yaml)

但是文件仍然为空。

我的CSV如下:

https://i.gyazo.com/f3fa5ba8b1bfdd014018da5b46fa7ec0.png

即使我尝试在创建文件的行之后放置“ hello world”之类的字符串,也行不通...

1 个答案:

答案 0 :(得分:3)

您忘记关闭文件。

您可以显式地进行操作(最佳实践是在ensure块中进行操作),也可以使用File.open with block

更新:

  

IO#close → nil

     

关闭ios并刷新对操作系统的所有挂起写入。该流不可用于任何进一步的数据操作;如果尝试这样做,则会引发IOError。当垃圾回收器声明I / O流时,它们会自动关闭。

https://ruby-doc.org/core-2.5.0/IO.html#method-i-close

因此,您的更改不会从IO缓冲区刷新到磁盘。您也可以使用显式IO#flush来执行此操作,但是最好关闭打开的文件。

# explicit close
class FillLanguages
  require 'csv'

  def self.get
    result = []
    file = File.new('config/locales/languages.yml', 'w')

    CSV.foreach('lib/csv/BCP-47_french.csv', headers: false, col_sep: ';') do |row|
      result.push(row[0])
      hash = {}
      key = row[0]
      hash[key] = row[1]

      file.puts(hash.to_yaml)
    end

    result
  ensure
    file.close
  end
end

-

# block version
class FillLanguages
  require 'csv'

  def self.get
    result = []
    File.open('config/locales/languages.yml', 'w') do |file|

      CSV.foreach('lib/csv/BCP-47_french.csv', headers: false, col_sep: ';') do |row|
        result.push(row[0])
        hash = {}
        key = row[0]
        hash[key] = row[1]

        file.puts(hash.to_yaml)
      end
    end

    result
  end
end