2011-01-20 2 views
1

이 구조를 상상 :Sinatra의 공용 디렉토리를 쉽게 참조 할 수 있습니까?

/project 
     /templates 
      view1.haml 
      view2.haml 
      misc_views/ 
      view3.haml 
      view4.haml 
      even_deeper/ 
       view5.haml 
     /public 
      script1.js 

이 템플릿의 깊이는 다를 수 있습니다, 나는 그것에서 일부 파일을 포함 할 경우 나는 대중 디렉토리를 참조하고 싶습니다. 나에게 공용 디렉토리로 안내하는 도우미 또는 기타 특수 효과가 있습니까? 내 의견에는 ../../../public/script1.js, ../../public/script1.js와 같은 것이있는 것 같습니다. 확실히 더 좋은 방법이 있어야합니다.

+0

, 당신은 당신이 웹 브라우저로 전송되는 HTML에 포함 할 필요가 디스크에있는 파일의 상대 경로가 아닌 것을 깨닫게하지만, 제공 경로 및 루트 사이에 오히려 상대 경로를 명확하게하려면 공개 디렉토리에요? 예를 들어'get ("/ foo") {haml 'misc_views/even_deeper/view5.haml'}'이 있으면 HTML에'src = "script1.js"'또는'src = "/ script1.js가 있어야합니다 ". – Phrogz

+0

물론. 그것은 말하지 않고 간다. – Geo

답변

3

the settings.public configuration을 사용하여 공용 디렉토리를 나타낼 수 있습니다. 예를 들면 다음과 같습니다.

get "/" do 
    js = File.join(settings.public, 'script1.js') 
    File.exists?(js) #=> true 
end 

절대 경로이므로 파일을 가져 오기 위해 상대 경로로 지정할 필요가 없습니다. 당신은 당신의 관점에서 볼 수 있지만, 나는 개인적으로 경로를 컨트롤러로부터 인스턴스 변수로 설정할 것이다.

get "/" do 
    # If you really only need the directory 
    @public = settings.public 

    # If you actually need the path to a specific file 
    @main = File.join(settings.public, 'main.js') 

    # If you actually need the contents of a file 
    @js = IO.read(File.join(settings.public, 'main.js')) 
end 
1

정적 리소스는 서버 측 코드가 아니라 브라우저를 요청하는 브라우저가되므로 웹 주소의 루트 또는 상대 요청 경로로 포함시켜야합니다. 내가 네 사건에서 착각하지 않는다면?

<script type="text/javascript" src="/script1.js"></script> 
+0

(@ Geo의 명확한 설명에 따른)이 (그렇지 않으면 올바른) 대답은 질문하는 것에 대한 대답이 아니기 때문에 Downvoted. – Phrogz

관련 문제