3

我在 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

4

2 回答 2

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
于 2014-02-26T07:30:20.757 回答
4

问题在于您使用dirname

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

dirname从路径中删除最后一个条目。根据文档

返回 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 非常有用,尽管它还很年轻。

于 2014-02-26T07:40:13.080 回答