Rails FileUtils.mkdir_p только создает родительские каталоги

У меня есть контроллер в Rails, с действием, предназначенным для создания нового каталога.

Это действие должно создать каталог "/public/graph_templates/aaa/test". Однако он оставляет за собой последний каталог "test". Почему это только создание родительских каталогов?

  def create_temporary_template
    dir = File.dirname("#{Rails.root}/public/graph_templates/aaa/test")
    FileUtils.mkdir_p dir
  end

Документы: http://ruby-doc.org/stdlib-1.9.3/libdoc/fileutils/rdoc/FileUtils.html

2 ответа

Решение

Потому что вы используете dir = File.dirname("#{Rails.root}/public/graph_templates/aaa/test"),

тогда dir является "#{Rails.root}/public/graph_templates/aaa",

Вы можете просто пройти путь к FileUtils.mkdir_p,

  def create_temporary_template
    dir = "#{Rails.root}/public/graph_templates/aaa/test"
    FileUtils.mkdir_p dir
  end

Проблема в том, что вы используете dirname:

File.dirname("/foo/bar")
# => "/foo"

dirname удаляет последнюю запись из пути. Согласно документации:

Возвращает все компоненты имени файла, указанного в file_name, кроме последнего.

Обычно это правильно, если ваш путь содержит каталог или иерархию каталогов с именем файла:

File.dirname("/foo/bar/baz.txt")
# => "/foo/bar"

Но, в этом случае, это отрубает желаемый конечный каталог.

Я бы посоветовал взглянуть на класс Pathname, который входит в стандартную библиотеку Ruby. Он объединяет File, Dir, FileUtils, FileTest и, возможно, швейцарский армейский нож и кухонную раковину в один класс, что делает его очень удобным для работы с файлами и каталогами в одном классе.

require 'pathname'
dir = Pathname.new("/foo/bar/baz.txt")
# => "/foo/bar"

dir.mkpath # would create the path

Я нашел Pathname очень полезным, хотя он еще молод.

Другие вопросы по тегам