Sinatra视图中的相对路径问题

时间:2010-05-11 20:40:21

标签: ruby sinatra erb

我在使用erb文件发布图像之前使用以下代码检查文件是否存在。这是一个ruby / sinatra应用程序 - 而不是rails。

<% @imagename = @place.name + ".jpg" %> 
<% if FileTest.exist?( "/Users/Tim/projects/game/public/" + @imagename ) %> 
<p><img src= '<%= @imagename %>' width="400" height="300" /> </p> 
<% end %> 

当我将它发布到Heroku时,它显然不起作用。

我尝试使用相对路径,但我无法让它工作:

<% if FileTest.exist?( "/" + @imagename ) %> 

2 个答案:

答案 0 :(得分:9)

/开头的路径不是相对路径,而是绝对路径。它说转到root,然后向下导航到以下路径

第一步是检查您的应用的运行位置。即什么是当前目录。要执行此操作,请暂时将<%= Dir.pwd %>放在您的视图中,并在本地和Heroku上进行尝试,以比较这两种环境。

然后尝试从此文件夹到图像的相对路径。例如如果应用程序从/Users/Tim/projects/game开始运行,则公开的相对路径仅为public,因此图片的路径为File.join('public', @imagename)

如果您需要更多帮助,请在两个环境中发布Dir.pwd的值


这是另一种方法:

__FILE__是一个特殊的Ruby变量,它给出了当前文件的相对路径。

利用它,在启动应用程序的.rb文件中设置一个常量,如下所示:

APP_ROOT = File.dirname(__FILE__)

(应用程序的config.rb中的类似行用于在Rails应用程序中设置RAILS_ROOT

然后在您的视图中,您可以使用:

FileTest.exist?(File.join(APP_ROOT, 'public', @imagename))

答案 1 :(得分:0)

你想要的是使用RAILS_ROOT常量 - 它指向你应用的文件夹。因此,在您的本地计算机上RAILS_ROOT将评估为/Users/Tim/projects/game/

这是特定于Rails的,请改用File.dirname(__FILE__)