【问题标题】:Relative path issue within Sinatra viewSinatra 视图中的相对路径问题
【发布时间】:2011-02-18 08:21:12
【问题描述】:

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

【问题讨论】:

    标签: ruby sinatra erb


    【解决方案1】:

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

    第一步是检查您的应用从何处运行。即当前目录是什么。为此,请暂时将 &lt;%= Dir.pwd %&gt; 放在您的视图中,并在本地和 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))
    

    【讨论】:

    • 针对上面的 Sinatra 进行了更新。让我知道这是否有帮助。
    • 这种方法有效:“然后尝试从这个文件夹到图像的相对路径。例如,如果应用程序从 /Users/Tim/projects/game 运行,那么公共的相对路径就是公共的,所以图像的路径是 File.join('public', @imagename)" APP_ROOT 方法给我一个统一的常量错误。工作中。谢谢 MikeJ!
    • 酷。很高兴它现在可以工作了。要使常量起作用,可能只需要针对您的应用程序的细节进行一些调整。
    【解决方案2】:

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

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

    【讨论】:

    • 解决方案发布后已澄清。在这种情况下,File.dirname(__FILE__) 可能会成功。
    猜你喜欢
    • 1970-01-01
    • 2019-07-18
    • 2014-07-03
    • 1970-01-01
    • 2014-05-09
    • 2016-01-08
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多