Sinatra로 정적 파일 제공


139

HTML, CSS 및 JavaScript 만 사용하는 한 페이지 웹 사이트가 있습니다. 앱을 Heroku에 배포하고 싶지만 방법을 찾을 수 없습니다. 이제 앱을 Sinatra와 함께 작동 시키려고합니다.

.
|-- application.css
|-- application.js
|-- index.html
|-- jquery.js
`-- myapp.rb

그리고 다음은의 내용입니다 myapp.rb.

require 'rubygems'
require 'sinatra'

get "/" do
  # What should I write here to point to the `index.html`
end

1
localhost : 2345 / index.html에 액세스하는 것이 효과적 이라는 것을 배웠습니다 .
TK.

WebBrick을 사용하여 몇 줄로 정적 파일을 제공 할 수 있습니다. require 'webrick'; server = WEBrick::HTTPServer.new Port: 1234; server.mount '/', WEBrick::HTTPServlet::FileHandler, 'www/'; trap("INT") { server.stop }; server.start;그런 다음를 실행하십시오 ruby myapp.rb. Heroku 용 포트를 제거하십시오. 에 넣으 web: ruby myapp.rb십시오 Procfile. 주석은 Sinatra가 아니기 때문에 대답하지 않지만 종속성을 단순화한다고 생각합니다.
클로이

답변:


131

추가 구성없이 Sinatra는에 자산을 제공 public합니다. 빈 경로의 경우 인덱스 문서를 렌더링하려고합니다.

require 'rubygems'
require 'sinatra'

get '/' do
  File.read(File.join('public', 'index.html'))
end

경로는 StringHTTP 응답 본문이 되는를 반환해야합니다 . File.read파일을 열고, 파일을 읽고, 파일을 닫고 a를 반환합니다 String.


52
오히려해야 send_file File.expand_path('index.html', settings.public)합니다.
Konstantin Haase

32
이것은 이제 올바르지 않습니다. 당신은 교체해야합니다 settings.public함께 settings.public_folder얻을send_file File.expand_path('index.html', settings.public_folder)
알리스 테어 홀트

2
@ zhirzh send_file, 그것은 당신을 위해 여분의 일을합니다 github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L351
iain

1
File.read전체 파일을 메모리로 읽습니다. 파일 크기와 동시 요청 수에 따라 OK가 될 수 있습니다.
Wayne Conrad

@WayneConrad의 반대면 send_file은 괜찮습니까? 또는 동일하게 작동합니까?
Ben

169

send_file헬퍼를 사용하여 파일을 제공 할 수 있습니다.

require 'sinatra'

get '/' do
  send_file File.join(settings.public_folder, 'index.html')
end

이것은 index.html응용 프로그램의 정적 파일을 갖도록 구성된 디렉토리에서 제공 됩니다.


19
최신 Sinatra 앱이 사용한다고 생각 set :public_folder합니다. settings.public_folder대신 settings.public
Andrew

4
settings.public_folder를 사용하도록 답변을 업데이트했습니다. 오래된 앱은 여전히 ​​settings.public을 사용해야 할 수도 있습니다.
Chad DeShon

62

공용 폴더에서 호스트 할 수 있으며 경로가 필요하지 않습니다.

.
-- myapp.rb
`-- public
    |-- application.css
    |-- application.js
    |-- index.html
    `-- jquery.js

myapp.rb에서

set :public_folder, 'public'

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

공용의 일부 하위 폴더에 연결

set :public_folder, 'public'
get "/" do
  redirect '/subfolder/index.html' 
end

./public의 모든 내용은 '/whatever/bla.html에서 액세스 할 수 있습니다.

예 :
./public/stylesheets/screen.css
경로가 필요없는 '/stylesheets/screen.css'를 통해 액세스 할 수 있습니다.


1
public에 index.html 파일이있는 중첩 된 폴더가 많으면 (라우트를 만들지 않으려는 경우) 기본값으로 사용하려면 어떻게해야합니까?
Derek 이전

솔루션을 확장했습니다. 명확히하는 데 도움이되기를 바랍니다. 모든 것이 공개적으로 액세스 가능하며 경로가 '공개'부분을 생략 할 필요가 없습니다.
Morgan

1
Heroku에서 랙업을 사용하려면 사용해야했습니다 set :public_folder, 'public'. Sinatra 문서에 이것이 이미 기본값으로 설정되어 있음을 암시하지만, 그것이 작동하는 열쇠였습니다.
Daniel C

12

프로덕션 환경 index.html에서는 요청이 Sinatra에 전달되지 않도록 웹 서버를 자동으로 보낼 수 있습니다 . 정적 텍스트를 제공하기 위해 Sinatra / Rack 스택을 거치지 않아도되므로 성능이 더 좋습니다. 이는 Apache / Nginx가하는 일 중 최고입니다.


아 그래 Erb를 사용하고 Varnish를 사용하여 현금으로 바꾸겠습니다.
ma11hew28

2
프로덕션 환경에서 어떻게 구성합니까? Sinatra와 Rack을 사용한이 상호 참조에 대한 문서를 찾고 있는데 찾을 수 없습니다. 나는 기본적으로 사용자는 폴더 이름을두고있는 경우 index.html을 일이있는 / 공용 폴더에 넣을 수 할

12

Sinatra는 docs에 설명 된대로 공개 디렉토리에서 정적 파일을 제공 할 수 있도록해야합니다 .

정적 파일

정적 파일은 ./public 디렉토리에서 제공됩니다. : public 옵션을 설정하여 다른 위치를 지정할 수 있습니다.

공용 디렉토리 이름은 URL에 포함되지 않습니다. ./public/css/style.css 파일은 example.com/css/style.css로 제공됩니다.


4
왜이 표가 4 표입니까? 폴더를 요청할 때 기본 문서를 표시하는 방법에 대한 질문에는 대답하지 않습니다.
Derek 이전


2

시나 - assetpack의 보석 기능의 전체 무리를 제공합니다. 문법이 달콤합니다 :

serve '/js', from: '/app/javascripts'

난 여전히 레일 자산 파이프 라인에 문제가있는 동안 나는 sinatra-assetpack을 사용하여 훨씬 더 많은 제어권을 가지고 있다고 생각 하지만 대부분의 경우 몇 줄의 코드로 작동합니다.


2

업데이트 된 답변 : css, js .... etc 내용을로드하는 ablle이없는 행운으로 위의 모든 내용을 묶었습니다.로드하는 유일한 것은 index.html입니다 ...404 error

내 해결책 : 앱 폴더는 다음과 같습니다.

index.rb == >> Sinatra 코드는 간다.

require 'rubygems'
require 'sinatra'

get '/' do
  html :index
end

def html(view)
  File.read(File.join('public', "#{view.to_s}.html"))
end

public folder== >> 다른 모든 것을 포함합니다 ... css, js, blah blah..etc.

user@user-SVE1411EGXB:~/sintra1$ ls
index.rb  public
user@user-SVE1411EGXB:~/sintra1$ find public/
public/
public/index.html
public/about_us.html
public/contact.html
public/fonts
public/fonts/fontawesome-webfont.svg
public/fonts/fontawesome-webfont.ttf
public/img
public/img/drink_ZIDO.jpg
public/js
public/js/bootstrap.min.js
public/js/jquery.min.js
public/js/bootstrap.js
public/carsoul2.html
public/css
public/css/font-awesome-ie7.css
public/css/bootstrap.min.css
public/css/font-awesome.min.css
public/css/bootstrap.css
public/css/font-awesome.css
public/css/style.css
user@user-SVE1411EGXB:~/sintra1$

이제 서버를 시작하면 문제없이 정적 페이지를 탐색 할 수 있습니다.

user@user-SVE1411EGXB:~/sintra1$ ruby index.rb 
== Sinatra/1.4.5 has taken the stage on 4567 for development with backup from Thin
>> Thin web server (v1.5.1 codename Straight Razor)
>> Maximum connections set to 1024
>> Listening on localhost:4567, CTRL+C to stop

2
require 'rubygems'
require 'sinatra'

set :public_folder, File.dirname(__FILE__) + '/../client'
#client - it's folder with all your file, including myapp.rb

get "/" do
  File.read('index.html')
end


1

index.html파일을로 이동하고 views/index.erb다음과 같은 엔드 포인트를 정의하는 것을 고려할 수 있습니다 .

get '/' do
  erb :index
end


0

public폴더에 파일을 넣는 것은 제한이 있습니다. 실제로, '/'브라우저가 CSS 파일의 상대 경로를 설정 /css/style.css하고 sinatra가 public디렉토리 에서 파일을 찾기 때문에 루트 경로 에있을 때 올바르게 작동합니다 . 그러나 귀하의 위치가 예를 들어 /user/create웹 브라우저 인 경우 웹 브라우저에서 귀하의 CSS 파일을 찾습니다/user/create/css/style.css 실패합니다.

해결 방법으로 CSS 파일을 올바르게로드하기 위해 다음 리디렉션을 추가했습니다.

get %r{.*/css/style.css} do
    redirect('css/style.css')
end

-7

이 솔루션은 어떻습니까? :

get "/subdirectory/:file" do 
  file = params[:file] + "index.html"
  if File.exists?(params[:file])
    return File.open("subdirectory/" + file)
  else
   return "error"
  end
end

예를 들어 / subdirectory / test /로 이동하면 subdirectory / test / index.html이로드됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.