Rails FileUtils.mkdir_p仅创建父目录

时间:2014-02-26 07:25:57

标签: ruby-on-rails ruby ruby-on-rails-4 fileutils

我在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#method-c-mkdir_p

2 个答案:

答案 0 :(得分:6)

因为您使用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

答案 1 :(得分:4)

问题在于你使用dirname

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

dirname删除路径中的最后一个条目。每the documentation

  

返回file_name中给出的文件名的所有组件,但最后一个除外。

如果您的路径包含目录或目录层次结构,并且文件名为

,通常这是正确的
File.dirname("/foo/bar/baz.txt")
# => "/foo/bar"

但是,在这种情况下,它会切断你想要的尾随目录。

我建议您查看Ruby标准库中包含的Pathname类。它将File,Dir,FileUtils,FileTest以及瑞士军刀和厨房水槽包装在一个类中,使得在一个班级上处理文件和目录非常方便。

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

dir.mkpath # would create the path

我发现Pathname非常有用,虽然它还很年轻。