4

在我的 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 ) %> 
4

2 回答 2

9

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

第一步是检查您的应用程序从哪里运行。即当前目录是什么。要做到这一点,请暂时放在<%= 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_ROOT在 Rails 应用程序中设置)

然后在您看来,您可以使用:

FileTest.exist?(File.join(APP_ROOT, 'public', @imagename))
于 2010-05-11T20:47:45.267 回答
0

你想要的是使用RAILS_ROOT常量 - 它指向你的应用程序的文件夹。所以在您的本地机器RAILS_ROOT上将评估为/Users/Tim/projects/game/.

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

于 2010-05-11T20:48:05.437 回答