3

application/xhtml+xml提供されるすべてのWebページにmimeタイプを提供したいSinatraWebアプリケーションを作成しています。テンプレートエンジンとしてBuilderを使用しています。このアプリケーションはapplication/xml、さまざまなAJAX apiインターフェイスにも対応し、Builderテンプレートエンジンとtext/cssscssテンプレートエンジンを使用することに注意してください。

生成されるWebページはコンテンツタイプを受け取りtext/htmlますが、APIインターフェイスはapplication/xml代わりにコンテンツタイプを受け取ります。ただし、mimeタイプがどのように決定されるかはわかりません。htmlタグの存在?レイアウトの使用かどうか?どちらの場合でも、アプリケーションでmimeタイプapplication/xhtml+xmlではなくmimetypeを発行するようにしたいと思います。text/html

呼び出しでmimeタイプを指定できることは知っていますがcontent_type、すべてのルーティング関数でこれを必要としないようにしたいと思います。特定のテンプレートエンジンにデフォルトのmimeタイプを設定する方法はありますか?または、mimeタイプをビューのファイル名で制御できますか?Tiltは、mimeタイプを適切に制御する手段を提供しますか?

4

1 に答える 1

3

アプリケーションは個別のオブジェクトに分解されるため、すべてのAJAXルートを個別のSinatraアプリケーションにプルするのは簡単です。これにより、シナトラのアフターフックを使用できるようになります。唯一の要件は、AJAX呼び出しがAJAXとしてそれらを識別する何かを持っていることです。たとえば、リクエストヘッダーを特別な値に設定したり、特別にフォーマットされたルートを使用したりします。一意のルート方式のラックアップファイルの例を次に示します。

require 'sinatra/base'

class MainApp

  def get_info params
    # return some data structure
  end

end

class MainAppRoutes < Sinatra::Base

  def initialize mainapp
    super()
    @mainapp = mainapp
  end

  get '/' do # main page
    data = @mainapp.get_info(params)
    # render response from data
  end

end

class AjaxRoutes < Sinatra::Base

  def initialize mainapp
    super()
    @mainapp = mainapp
  end

  get '/getinfo' do # handler for /ajax/getinfo
    data = @mainapp.get_info(params)
    # generate XML response from data
  end

  after do
    content_type 'application/xml'
  end

end

mainapp = MainApp.new

map '/ajax' do
  run AjaxRoutes.new(mainapp)
end
run MainAppRoutes.new(mainapp)

この例では、/ ajaxで始まるすべてのルートは、AjaxRoutesクラスのインスタンスによって処理されます。afterフックは、これらの応答のコンテンツタイプが「application/xml」であることを確認します。非ajaxルートは影響を受けません。

覚えておくべきいくつかのこと:

  • Rack :: Builder.mapは、一致するURLの部分を取り除きます。したがって、AjaxRoutesの「/」ルートは実際には「/ajax/」の要求に応答します。
  • Sinatraから派生したエンドポイントクラスの初期化子で常にsuper()を呼び出します。Sinatraミドルウェアの場合、最初の引数を渡します(Rackは次のRackアプリを最初のパラメーターとして#newを呼び出します)。
  • Sinatraフィルターに関するドキュメントを確認してください。アフターフックを使用して応答を変更することについて、イライラする可能性のある癖があります。
于 2012-10-11T21:44:27.100 に答える