2011-01-28 8 views
5

私はnodejsでexpressを使用しています。私のレイアウトの中に、私は(私がヒスイを使用しています)は、次のようなものを持っているexpressjsレンダリングでレイアウト・ローカルをDRYする

body 
    nav.login 
    -if(currentUser) 
     ="logged in information" 
    -else 
     ="logged out information" 
    !=body 

問題は、私は、レンダリングするたびに、私は今

res.render('anything.jade',{ 
    locals: { 
    currentUser: req.session.currentUser, 
    /*all of my other locals*/ 
    } 
}); 

を持つことが必要だということですそれはのように思えますレンダリングのすべての呼び出しを行ってそれを追加しなければならない苦痛と、レイアウトに他の地元の人々を加えなければならない場合、同じことをする必要があります。レンダリングした場所のどこでもローカルユーザに 'currentUser'を再入力する必要がないようにする方法はありますか?

答えて

9

私はこの答えは遅れているが、後世のために知っているかもしれません。もし明示的に使用している場合、引数としてreq,resを取るビューにアクセス可能なヘルパー関数である、付属の動的ヘルパーを使用する必要があります。あなたのケースでは:あなたのビューを意味

app.dynamicHelpers({ 
    user: function(req, res){ 
    return req.session.currentUser; 
    } 
}); 

は今、これは私より良い答えのように見える#{user}

+0

を呼び出すことができます。 – Ryan

+0

これはすばらしいヒントですが、私が最初に質問したときに、どのようにうまく統合されたヘルパーがExpressに入ったのかよくわかりません。私は "サイト"オブジェクトを各render()呼び出しに渡すことがありました。ありがとう! –

0

最も簡単な解決策は、地元のオブジェクトを返す関数を使うことです。

function(req) { 
    return { 
     currentUser: req.session.currentUser, 
     /*all of my other locals*/ 
    }; 
} 

res.render('anything.jade',{ 
    locals: defaultLocals(req) 
}); 
2

私は次のことをやってしまった:

最初、私はいくつかのローカル変数が

app.use(function(req,res,next){ 
    req.localvars = new Object; 
    next(); 
}); 

後に、私は私が設定し、いくつかのローカル変数に

app.use(function(req,res,next){ 
    req.localvars.currentUser = req.session.currentUser; 
    next(); 
}); 

を設定する設定レンダリング機能

function renderer(file){ 
    return function(req,res,next){ 
    res.render(file,{locals:req.localvars}); 
    } 
} 

、ルーティング機能のための

app.get('/',blah,blah,whatever,setSomeMoreLocalsHere,renderer(index.jade)); 

あり、より良いものになるが、それは私が考え出した最善の解決策だ、これまで

関連する問題