Ruby on rails 如何在Rails 3.2中获得相对路径?

Ruby on rails 如何在Rails 3.2中获得相对路径?,ruby-on-rails,Ruby On Rails,我有一个文件列表,我试图得到一个相对路径 file = "/Users/yves/github/local/workshop/public/uploads/craftwork/image/1/a1d0.jpg" Rails.public_path => "/Users/yves/github/local/workshop/public" #我正在尝试获取=>“uploads/craftwork/image/1/a1d0.jpg” file.relative_path_from(Rails

我有一个文件列表,我试图得到一个相对路径

file = "/Users/yves/github/local/workshop/public/uploads/craftwork/image/1/a1d0.jpg"
Rails.public_path => "/Users/yves/github/local/workshop/public"
#我正在尝试获取=>“uploads/craftwork/image/1/a1d0.jpg”

file.relative_path_from(Rails.public_path)#错误

#提升:对于#您可以使用未定义的方法“relative_path_from”进行“欺骗”,只需使用sub

$ cat foo.rb 
file = "/Users/yves/github/local/workshop/public/uploads/craftwork/image/1/a1d0.jpg"
public_path = "/Users/yves/github/local/workshop/public"
puts file.sub(/^#{public_path}\//, '')

$ ruby foo.rb 
uploads/craftwork/image/1/a1d0.jpg

你可以“作弊”,只需使用sub

$ cat foo.rb 
file = "/Users/yves/github/local/workshop/public/uploads/craftwork/image/1/a1d0.jpg"
public_path = "/Users/yves/github/local/workshop/public"
puts file.sub(/^#{public_path}\//, '')

$ ruby foo.rb 
uploads/craftwork/image/1/a1d0.jpg

由于这些属性现在返回字符串,我们可以将它们转换回路径名:

public_path = Pathname.new( Rails.public_path )
file_path = Pathname.new( file )
然后使用相对路径函数,最后将其转换回字符串

relative_path = file_path.relative_path_from( public_path ).to_s 
一起成为

Pathname.new( file ).relative_path_from( Pathname.new( Rails.public_path ) ).to_s 

由于这些属性现在返回字符串,我们可以将它们转换回路径名:

public_path = Pathname.new( Rails.public_path )
file_path = Pathname.new( file )
然后使用相对路径函数,最后将其转换回字符串

relative_path = file_path.relative_path_from( public_path ).to_s 
一起成为

Pathname.new( file ).relative_path_from( Pathname.new( Rails.public_path ) ).to_s 

这就是我所用的:

"#{Rails.root}/public/spreadsheets/file_name.xlsx"

这就是我所用的:

"#{Rails.root}/public/spreadsheets/file_name.xlsx"

我认为来自
相对路径是
路径名
上的Ruby方法;不知道Rails曾经将它添加到字符串中(并不意味着它没有,但我在任何地方都没有看到)。看来它需要另一个路径名,而不是字符串,因为它在参数上调用
cleanpath
。我认为
中的
相对路径是
路径名上的Ruby方法;不知道Rails曾经将它添加到字符串中(并不意味着它没有,但我在任何地方都没有看到)。当然,它需要另一个路径名,而不是字符串,因为它对其参数调用
cleanpath
。@Derk-Jan很好。我以为他会使用Rails.root等使其不依赖于目录。@Derk-Jan说得对。我认为他会使用Rails.root等使其成为目录无关的。