我在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
答案 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非常有用,虽然它还很年轻。