4

Middlemanを使用して静的サイトを作成しています。

Middlemanは静的htmlファイルを./buildディレクトリに生成します。

現在使用している構成は次のとおりです。

require 'rubygems'
require 'middleman'
require 'rack/contrib/try_static'

use Rack::TryStatic, :root => "build", :urls => %w[/], :try => ['.html']

run Middleman::Application.server

そのため、Middlemanは現在静的ファイルを提供しています。Rack::TryStaticリクエストを直接処理するにはどうすればよいですか?

私はそれを次のようなものにしようとしました

run Rack::TryStatic, :root => "build", :urls => %w[/], :try => ['.html']

しかし、それは機能しません。実行されるのは1つの引数のみを受け入れます。そしてRack::TryStatic、2つの引数が必要でappありoptions、初期化するために、そして私は何も持っていませんapp

これどうやってするの?

(そして、それが重要な場合は、Herokuにデプロイしています)

4

1 に答える 1

3

お気づきのように、などのRackミドルウェアコンポーネントには、Rack::TryStaticリクエストを渡すために別のアプリが必要です。たとえば、次のような404応答を返すだけの簡単なものを作成できます。

app = lambda {|env| [404, {'Content-type' => 'text/plain'}, ['Not found']
run Rack::TryStatic.new app, :root => "build", :urls => %w[/], :try => ['.html']

または同等に:

use Rack::TryStatic, :root => "build", :urls => %w[/], :try => ['.html']
run lambda {|env| [404, {'Content-type' => 'text/plain'}, ['Not found']]}

独自の404ファイルがある場合は、独自Rack::NotFoundのカスタムエンドポイントの代わりにrack-contribを使用できます。

use Rack::TryStatic, :root => "build", :urls => %w[/], :try => ['.html']
run Rack::NotFound.new('path/to/your/404.html')

:tryファイル拡張子の配列を使用してサービスを提供していなかった場合は、Rack::File直接使用できます。内部的には、をRack::TryStatic使用しRack::Static、次にを使用しますRack::FileTryStaticおよびとは異なりStaticRack::Fileはそれ自体がRackアプリケーションであるため、リクエストを渡すために別のアプリは必要ありません。その場合、あなたconfig.ruは単純に次のようになります。

run Rack::File.new './build'

ただし、これでは「ベア」リクエストを対応する.htmlファイルで処理することはできません。すべてのリクエストでファイル名全体を指定する必要があります。

于 2012-08-07T05:17:17.130 に答える