Относительная проблема пути в представлении Синатры - PullRequest
4 голосов
/ 12 мая 2010

Я использую следующий код для проверки существования файла перед публикацией изображения в моем файле erb. Это приложение ruby ​​/ sinatra, а не рельсы.

<% @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 ]

9 голосов
/ 12 мая 2010

Путь, начинающийся с /, - это не относительный путь, это абсолютный путь. Там написано перейдите в корень и перейдите по следующему пути

Первый шаг - проверить, откуда запускается ваше приложение. то есть, что является текущим каталогом. Для этого временно поместите <%= 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))
0 голосов
/ 12 мая 2010

То, что вы хотите, это использовать константу RAILS_ROOT - она ​​указывает на папку вашего приложения. Так что на вашем локальном компьютере RAILS_ROOT будет оцениваться как /Users/Tim/projects/game/.

Это специфично для Rails, используйте File.dirname(__FILE__).

...