Sinatra视图中的相对路径问题

tim*_*rts 4 ruby erb sinatra

我在我的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 %> 
Run Code Online (Sandbox Code Playgroud)

当我将它发布到Heroku时,它显然是行不通的.

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

<% if FileTest.exist?( "/" + @imagename ) %> 
Run Code Online (Sandbox Code Playgroud)

mik*_*kej 9

以a开头的路径/不是相对路径,这是绝对路径.它表示转到root,然后向下导航到以下路径

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

然后尝试从此文件夹到图像的相对路径.例如,如果应用程序/Users/Tim/projects/game从那时开始运行,那么公共的相对路径就是public图像的路径File.join('public', @imagename)

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


这是另一种方法:

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

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

APP_ROOT = File.dirname(__FILE__)
Run Code Online (Sandbox Code Playgroud)

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

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

FileTest.exist?(File.join(APP_ROOT, 'public', @imagename))
Run Code Online (Sandbox Code Playgroud)