2010-04-04 3 views
12

Sinatra를 사용하여 정적 파일을 public/ (기본값)에 배치하여 게재 할 수 있습니다. - 현재 index.html을 가지고 있지만 그 파일의 루트 지점을 어떻게 만들 수 있습니까? 그것을 템플릿으로 해석 할 필요없이?Sinatra (Ruby)의 정적 페이지 라우팅

분명히하려면 /index.html에 성공적으로 액세스 할 수 있으며 /은 동일한 정적 파일이 되도 록 리디렉션하지 않고 라우팅하고 싶습니다. 어떤 생각을 어떻게 할 것인가?

답변

18

아마도 더 좋은 대답이 나올 것입니다. 그때까지 이것이 내 기회입니다. 이없는 경우

당신이 원하는 : 당신이 피하고 싶은 이유는 확실하지,하지만

get '/' do 
    File.new('public/index.html').readlines 
end 

내가 첫 번째로 갈 것 :

get '/' do 
    redirect '/index.html' 
end 

당신은 같은 것을 할 수 리디렉션

+0

투표에 설명한다. 승객을 사용하는 경우에도 이것은 작동합니다. 라우팅 필요 또는 리디렉션 없음. – rubiii

+1

@rubii 나는 승객의 길을 자신의 대답으로 두는 것이 가치 있다고 생각한다. 그건 내 대답보다 정확한 대답 같아. –

+0

난 당신의 대답은 완벽하게 괜찮다고 생각합니다. 나는 JP가 승객을 사용하지 않을 것이라고 생각합니다. 하지만 나는 다른 사람들에게 대답을 게시 할 것이다. – rubiii

3

passenger을 사용하면이 기능을 바로 사용할 수있는 것 같습니다. 공개 디렉토리에 index.html 파일이 있고 라우팅이 없으면 루트 URL에 액세스 할 때 index.html이 표시됩니다.

6

앱 클래스 내에 enable :static을 그냥 설정하십시오. 그래서 같이 :

class App < Sinatra::Base 
    # Set the app root; this is where the 'public' and 'views' 
    # directories are found (by default). 
    set :root, File.expand_path("#{File.dirname(__FILE__)}/../app") 

    # Allow the app to serve static files from the 'public' directory in :root 
    enable :static 
end 
3

나는시나/랙 방금 /에 가면 역할을 할 수있는 기본 파일의 개념이 없기 때문에 이것은 단지 문제라고 생각합니다. 아파치 나 Nginx와 같은 웹 서버에서 이것은 당신을 위해 돌봐 주며, 보통 index.html index.htm (만약 존재한다면, 결국 실제 파일 이름이없는 디렉토리로 갈 때 기본값이된다)으로 기본 설정된다.

모두가 이것이 승객에게 내장된다고 말하면, 그것이 정말로 아파치/Nginx에 내장되었다는 것을 의미한다고 생각합니다. Apache/Nginx는 정적 파일이 존재하는지 확인하고 제공한다면 요청을 랙으로 가져 오지 않을 것입니다. 이는 성능면에서 최고입니다.

HTTP의 전체 개념을 위반하는 404 페이지로 리다이렉션을 설정하고 싶지 않습니다. 엔드 포인트가 해당 엔드 포인트의 실제 상태를 리턴해야하는 모든 것에 대해 하나의 엔드 포인트가 있어야합니다. 당신이 /asdf에 가면 을 원한다. 실제로 웹 서버가 404를보고하기를 원한다. 리디렉션을하면 이제 사이트에 "나는 여기에 뭔가가 있었지만 움직였습니다."라고 말하고 페이지로 이동하는 페이지는 페이지의 텍스트에 404라고 표시되어 실제로 웹에서보고합니다 서버를 200으로 지정하면 "이 페이지에서 모든 것이 정상입니다!"라는 의미입니다.