Sinatraで静的ファイルを提供する


139

HTML、CSS、JavaScriptのみを使用する1ページのウェブサイトがあります。アプリをHerokuにデプロイしたいのですが、方法がわかりません。私は現在、アプリをシナトラで動作させるようにしています。

.
|-- 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。シナトラ向けではないため、コメントは回答しないでください。ただし、依存関係を簡略化すると思います。
Chloe

回答:


131

追加の設定なしで、Sinatraはのアセットを提供しpublicます。空のルートの場合、インデックスドキュメントをレンダリングする必要があります。

require 'rubygems'
require 'sinatra'

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

ルートはString、HTTP応答の本文になるa を返す必要があります。File.readファイルを開き、ファイルを読み取り、ファイルを閉じ、を返しますString


52
むしろすべきですsend_file File.expand_path('index.html', settings.public)
Konstantin Haase、2012年

32
これは正しくありません。取得するには、settings.publicと交換する必要settings.public_folderがありますsend_file File.expand_path('index.html', settings.public_folder)
Alistair Holt

2
@zhirzh send_file、それはあなたのために余分なことをしますgithub.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L351
iain

1
File.readファイル全体をメモリに読み込みます。これは、ファイルのサイズと同時要求の数に応じて、問題ない場合があります。
ウェインコンラッド

反対に@ WayneConrad、send_fileは大丈夫ですか?それとも同じように機能しますか?
Ben

169

send_fileヘルパーを使用してファイルを提供できます。

require 'sinatra'

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

これはindex.html、アプリケーションの静的ファイルを持つように構成されているディレクトリから提供されます。


19
新しいシナトラアプリではを使用set :public_folderしているので、settings.public_folder代わりに使用しますsettings.public
Andrew

4
答えを更新して、settings.public_folderを使用します。古いアプリはまだsettings.publicを使用する必要があるかもしれません。
Chad DeShon、2012

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
デフォルトにしたいindex.htmlファイルを持つ多くのネストされたフォルダー(ルートを作成したくない)がpublicにある場合はどうなりますか?
Derek Prior

ソリューションを拡張しました。私はそれが明確に役立つことを願っています、すべてが公共の場でアクセス可能であり、経路の「公共」の部分を省くだけで経路は必要ありません。
モーガン

1
Herokuでラックアップを使用しましたset :public_folder, 'public'。これが機能するための鍵でしたが、Sinatraのドキュメントでは、これが既にデフォルトとして設定されていることが示唆されています。
ダニエルC

12

本番環境でindex.htmlは、リクエストがSinatraに届かないように、Webサーバーを自動的に送信できることに注意してください。静的テキストを提供するためだけにSinatra / Rackスタックを通過する必要がないため、これはパフォーマンスに優れています。これは、Apache / Nginxが優れていることです。


ああそうだ。Erbを使用し、Varnishを使用して現金化します。
ma11hew28

2
これを本番環境でどのように構成しますか?私はこのシナトラとラックとの相互参照に関するドキュメントを探していましたが、見つかりません。基本的に、ユーザーがフォルダー名を入力するだけの場合は、index.htmlを1

12

Sinatra では、ドキュメントで説明されているように、パブリックディレクトリから静的ファイルを提供できます。

静的ファイル

静的ファイルは./publicディレクトリから提供されます。:publicオプションを設定して、別の場所を指定できます。

パブリックディレクトリ名はURLに含まれていないことに注意してください。ファイル./public/css/style.cssは、example.com / css / style.cssとして利用できます。


4
なぜこれは4票を持っているのですか?フォルダが要求されたときにデフォルトのドキュメントを提示する方法の質問には答えません。
Derek Prior


2

シナトラ・assetpackの逸品機能の全体の束を提供しています。構文は甘いです:

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

Railsアセットパイプラインでまだ問題が発生している間、sinatra-assetpackを使用してはるかに制御できるように感じますが、ほとんどの場合、数行のコードで機能します。


2

更新された回答:css、js .... etcのコンテンツをロードするのに失敗することなく、上記すべてを結び付けました。ロードしていたのはindex.htmlだけで、残りは= >>でした。404 error

私の解決策:appフォルダーは次のようになります。

index.rb == >>シナトラコードが行く。

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、何とか何とか..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.csssinatraがpublicディレクトリでファイルを探すため、ルートパスにいるときは正しく機能します。ただし、場所がの場合/user/create、Webブラウザーは次の場所で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.