3

Snap 0.9 (および、おそらく他のバージョン) でのルーティングの奇妙さを理解できません。

ハンドラー内にifTop関数を入れない限り、「/」はすべてをキャッチするパターンだと理解していますよね?したがって、("/", blah) ルートでは、URL は blah ハンドラーによって処理される必要がありますね。

snap init によって生成されたデフォルトのアプリで遊んでいると、ルート リクエストの index.tpl 以外のものをレンダリングするための snap を取得できません。

指定されたルート (「/」、何とか) とハンドラー

blah :: Handler App App ()
blah = render "blah"

ルート URL 以外の任意の URL の何とかテンプレートをレンダリングします! したがって、「/anything」は何とかテンプレートをレンダリングしますが、「/」はインデックス テンプレートをレンダリングします。

何とかハンドラーをに変更する

blah = ifTop $ render "blah"

動作をまったく変更しません。この場合のみ、「/anything」にルーティングできません。「/」へのルーティングは引き続きインデックス テンプレートをレンダリングします。私は何が欠けていますか?選択したテンプレートをレンダリングするために「/」を取得するにはどうすればよいですか?

4

1 に答える 1

5

「index.tpl」テンプレートがある場合は、ルート ページのレンダリングに使用されます。問題はheistInit機能です:

heistInit :: FilePath                 -- ^ Path to templates
          -> SnapletInit b (Heist b)
heistInit templateDir = do
    makeSnaplet "heist" "" Nothing $ do
        hs <- heistInitWorker templateDir defaultHeistState
        addRoutes [ ("", heistServe) ]
        return hs

を呼び出していることがわかりaddRoutesます。heistInitそのため、独自のルートを追加する前に呼び出した場合 (デフォルト テンプレートでそれが行われます)、同じ名前 (またはルートの場合は index.tpl) のテンプレートが存在する場合、ハンドラーにはチャンスがありません。

したがって、addRoutes routes上に配置するだけですheistInitappデフォルトテンプレートの Site.hs 内)。

于 2012-06-20T09:07:24.057 に答える