2010-05-11 6 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 %> 

내가 이것을 Heroku에 게시하면 분명히 작동하지 않습니다.

나는 상대 경로를 사용하여 시도,하지만 난 그게 작동시킬 수 없어요 : 경로가 /로 시작

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

답변

9

즉 절대 경로입니다, 상대 경로가 아닙니다. 이 루트로 이동 한 후 다음 경로로 이동하십시오.

첫 번째 단계는 앱이 어디에서 실행되고 있는지 확인하는 것입니다. 즉 현재 디렉토리는 무엇입니까? 이렇게하려면 <%= Dir.pwd %>을 임시로 넣고 로컬 및 Heroku에서이 두 환경을 비교해보십시오.

그런 다음이 폴더에서 이미지로 상대 경로를 시도하십시오. 예 : 앱에서 /Users/Tim/projects/game에서 실행되고있는 경우, 공공의 상대 경로는 다음 두 환경에서 Dir.pwd의 가치를 게시하시기 바랍니다 더 많은 도움이 필요하면 바로 public 그렇게 이미지의 경로가 File.join('public', @imagename)

을 것입니다


다음은 다른 접근 방식입니다.

__FILE__은 현재 파일에 대한 상대 경로를 제공하는 특수 루비 변수입니다. 다음과 같이 응용 프로그램을 시작하는 .rb 파일에, 그것의 사용을 만들기

는 상수를 설정합니다

APP_ROOT = File.dirname(__FILE__) 

(앱의 config.rb에서 비슷한 라인은 레일 응용 프로그램에 RAILS_ROOT을 설정하는 데 사용됩니다)

그런 다음보기에 당신은 사용할 수 있습니다 : 당신이 원하는 무엇

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

Sinatra에서 어떻게해야합니까? –

+0

위의 Sinatra에 업데이트되었습니다. 이것이 도움이되는지 알려주십시오. – mikej

+0

이 접근 방식은 작동했습니다 : "응용 프로그램이/Users/Tim/projects/game에서 실행 중이면 공용 폴더에 대한 상대 경로가 공개이므로 이미지에 대한 경로가 be File.join ('public', @imagename) " APP_ROOT 접근법은 나에게 단위 화 된 상수 오류를 표시합니다. 지금 일하고있어. 마이크, 감사합니다! –

0

RAILS_ROOT 상수를 사용되는 - 그것은를 가리키는 앱의 폴더 따라서 로컬 컴퓨터에서 RAILS_ROOT/Users/Tim/projects/game/으로 평가됩니다.

이것은 레일 전용이며 대신 File.dirname(__FILE__)을 사용하십시오.

+0

정말요? sinatra 애플 리케이션에? –

+0

솔루션을 게시 한 후이 내용이 명확 해졌습니다. 이 경우에는'File.dirname (__ FILE __)'은 아마 트릭을 할 것입니다. –