2010-05-11 4 views
4

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

<% @imagename = @place.name + ".jpg" %> 
<% if FileTest.exist?("/Users/Tim/projects/game/public/" + @imagename) %> 
<p><img src= '<%= @imagename %>' width="400" height="300" /> </p> 
<% end %> 

И когда я опубликую это в Героку, это явно не сработает.

Я попытался с помощью относительного пути, но я не могу заставить его работать:

<% if FileTest.exist?("/" + @imagename) %> 

ответ

9

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

Первый шаг - проверить, где работает ваше приложение. то есть текущий каталог. Для этого временно поставьте <%= Dir.pwd %> на ваш взгляд и попробуйте как локально, так и на Heroku, чтобы сравнить эти две среды.

Затем попробуйте относительный путь из этой папки в изображение. например Если приложение работает с /Users/Tim/projects/game то относительным путем к публике только public поэтому путь к изображению будет File.join('public', @imagename)

Если вам нужна дополнительная помощь, то пожалуйста, напишите значение Dir.pwd из обоего сред


Вот другой подход:

__FILE__ специальные переменный рубин, которая дает относительный путь к текущему файлу.

Используя это, в .rb файл, который начинается приложение устанавливается постоянная следующим образом:

APP_ROOT = File.dirname(__FILE__) 

(подобная линия в config.rb приложение, в используется для установки RAILS_ROOT в Rails приложения)

Затем на ваш взгляд, вы можете использовать:

FileTest.exist?(File.join(APP_ROOT, 'public', @imagename)) 
+0

Как это сделать в Синатре? –

+0

Обновлено для Sinatra выше. Позвольте мне знать, если это помогает. – mikej

+0

Этот подход сработал: «Затем попробуйте относительный путь из этой папки в образ. Например, если приложение запущено из/Users/Tim/projects/game, то относительный путь к публике является просто общедоступным, поэтому путь к изображению будет be File.join ('public', @imagename) " Подход APP_ROOT для меня представляет собой унифицированную постоянную ошибку. теперь работает. спасибо MikeJ! –

0

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

Это Rails специфический, вместо этого используйте File.dirname(__FILE__).

+0

действительно? в приложении синатра? –

+0

Это было выяснено после публикации решения. В этом случае 'Файл.dirname (__ FILE __) ', вероятно, сделает трюк. –

Смежные вопросы