我在使用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 ) %>
答案 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__)
。