1

テンプレートに主にerbを使用しているsinatraアプリがありますが、サーバー側とクライアント側の両方でレンダリングする必要があるhtmlのブロックに口ひげの部分を追加しています。追加する口ひげテンプレートを含むすべてのテンプレートを保持する「views」ディレクトリがあります。たとえば、構造は次のようになります。

views/
    index.html.erb
    _wingding.html.erb
    _widget.html.mustache

このエンドポイントを使用してindex.html.erbをレンダリングしているとしましょう。

get '/' do
    erb :index
end

そして、そのテンプレート内で、上記の両方のパーシャルをレンダリングしたいと思います[更新:このpartialメソッドはsinatraに組み込まれていませんが、gemを介して含まれています(詳細については私の回答を参照してください)が、それでもメインのsinatraに依存していますレンダリングコンポーネントなので、ここでの問題はまだ残っています。]。したがって、index.html.erbには次のものが含まれます。

<%= partial :wingding %>
<%= partial :widget %>

erb部分(wingding)は正常にレンダリングされますが、口ひげ部分(ウィジェット)は正常にレンダリングされません。これにより、アプリケーションは例外をスローします。

テンプレートエンジンが見つかりません:口ひげ

プロジェクトに「口ひげ」の宝石を含めました。やってみ'require mustache/sinatra'ましregister Mustache::Sinatraた。これらのステートメントは両方とも機能しましたが、上記の問題は解決しませんでした。口ひげを部分的にレンダリングできるように、sinatraに口ひげについて伝える方法はありますか?

この構成を含めることで、ビューディレクトリを設定しています。

configure do
    set :views, File.join(File.dirname(__FILE__), 'views')
end

バージョン番号:

  • シナトラ1.3.1
  • 口ひげ0.99.4
  • ルビー1.9.3
4

2 に答える 2

2

したがって、他の回答キャッシュ出力のソリューションにリストされているgemが判明しました。つまり、同じリクエストに異なるローカルの同じパーシャルを含めることはできず、私の目的には価値がありません。それで、これが私が決めたもう一つの(確かにハックっぽい)解決策です。特定のビューのコンテンツを配信するだけのヘルパーを作成しました。

helpers do
    def template_contents(path)
        File.open("#{settings.views}/#{path}") { |f| f.read }
    end
end

次に、私は通常のことをしますMustache#render

<%= Mustache.render(template_contents('_widget.html.mustache'), { ... }) %>

これは私のユースケースに最適です。

于 2012-11-09T22:31:15.557 に答える
1

私はこれを理解しました。まず、質問を投稿したときに気づかなかったことに注意する必要があります。partial実際にはシナトラに組み込まれていません。それはsinatra-moregemの一部として私のアプリに含まれています(廃止され、その機能のほとんどは現在padrinoと呼ばれるプロジェクトにありますが、まだsinatra-moreをこのアプリで使用しています)。部分的なメソッドは次のように含まれています。

require 'sinatra_more/render_plugin'

module Sinatra
    register SinatraMore::RenderPlugin
end

とにかく、それはpartial(他のいくつかのレンダリングヘルパーと一緒に)メソッドを追加するだけですが、このメソッドは組み込みのsinatraレンダリングコードにフォールバックするので、この事実はこの質問で目前の実際の問題とは無関係です-sinatraはデフォルトでは、口ひげテンプレートエンジンを認識します。誰かがそれを機能させるために超シンプルな宝石、sinatra-mustacheを作成したことが判明しました。宝石を含めるだけで、ライブラリが必要になります。

require 'sinatra/mustache'

それだけです-それはうまくいきます!追加の構成は必要ありません。それがどのように機能するのか知りたい場合は、ソースコードは非常に単純です。新しいテンプレートエンジンをsinatraに登録するのは決してワンライナーではありませんが(「登録」は誤称です。基本的には実装する必要があります)、それでもかなり簡単です。

更新:このgemは、特定のリクエスト/テン​​プレートの出力をキャッシュするため、別のローカルで2回目に使用することはできません。それで問題ない場合もありますが、それでは私のユースケースには価値がありません。

于 2012-11-09T17:20:35.413 に答える