Файл не заполнен при использовании put - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь создать файл локали Rails из CSV.Файл создан и CSV правильно проанализирован, но файл не заполнен.У меня нет ошибок, поэтому я не знаю, что не так ...

Это мой код:

# 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) возвращает

---
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)
...

Но файл все еще пуст.

Мой CSV выглядит так:

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

Даже если я попытаюсь поместить строку типа «hello world» сразу после строки, в которой я создаю файл, она не будет работать ...

1 Ответ

0 голосов
/ 24 января 2019

Вы забыли закрыть файл.

Вы можете сделать это явно (рекомендуется делать это в блоке ensure) или использовать File.open с блоком .

ОБНОВЛЕНИЕ:

IO#close → nil

Закрывает ios и сбрасывает все ожидающие записи в операционную систему.Поток недоступен для любых дальнейших операций с данными;IOError повышается, если такая попытка сделана.Потоки ввода / вывода автоматически закрываются, когда они запрашиваются сборщиком мусора.

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

Таким образом, ваши изменения не записываются на диск из буферов ввода-вывода.Вы также можете использовать явное 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...