рефакторинг кода с использованием пути и записи в файл - PullRequest
1 голос
/ 12 февраля 2010

Я использую рубин на рельсах. Ниже приведенный код работает. Однако мне было интересно, можно ли это написать лучше.

  # Usage: write 'hello world' to tmp/hello.txt file
  # Util.write_to_file('hello world', 'a+', 'tmp', 'hello.txt')
  def self.write_to_file(data, mode, *args)
    input = args
    filename = input.pop
    dir = Rails.root.join(*input).cleanpath.to_s
    FileUtils.mkdir_p(dir)
    file = File.join(dir, filename)
    File.open(file, mode) {|f| f.puts(data) }
  end

Ответы [ 2 ]

2 голосов
/ 12 февраля 2010

Как часто вы собираетесь менять режим? Если не очень часто, я бы вставил это прямо в метод, а остальное сделаю так:

def self.write_to_file(data, *args)
  file = Rails.root.join(*args)

  FileUtils.mkdir_p(file.dirname)
  File.open(file, "a+") { |f| f.puts(data) }
end
0 голосов
/ 12 февраля 2010

Вы можете просто использовать существующий API вместо того, чтобы самостоятельно выполнять всю грязную работу, которая многое очищает:

def self.write_to_file(data, mode, *path)
  path = File.expand_path(File.join(path.flatten), Rails.root)
  FileUtils.mkdir_p(File.dirname(path))
  File.open(path, mode) do |fh|
    fh.print(data)
  end
end

Здесь следует отметить несколько вещей.

  • File.expand_path разрешит любые "../" части пути.
  • File.dirname отлично подходит для определения каталога произвольного пути к файлу.
  • Используйте File # print для записи данных в файл. Файл # put добавляет строку перевода.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...