2011-07-25 10 views
0

私は、ユーザーのためのサイドバーをレンダリングする部分的なレールを持っています。この部分の一部として、対応するグループの関連するモデルから計算されたスコアとともに、ユーザーのグループを表示する別の部分がレンダリングされます。その結果、私は以下の構造を持っている:Rails Partials:カプセル化された:ローカルまたはグローバル状態(@属性)を介してデータにアクセスしますか?

- view 
    -> renders sidebar 
     -> renders group_table 

部分のサイドバーは、多くのビューに含まれている(例えばショー、編集、カスタムアクション)と私は属性を設定するには、すべてのこれらのアクションのための私のコントローラでbefore_filterを持っていますビューに渡す必要がある、たとえば

@groups = @user.groups 
@group_ranking = [method with heavy calculations] # access via @group_ranking[group] 

よりそれに何もしないいる(部分サイドバーを介して私はgroup_table部分的に@group_rankingsを渡す必要が、グローバル状態なしで上記と維持カプセル化され、自己完結型のパーシャルから構造を維持それを渡す)。サイドバーには別のデータが必要な部分データも含まれているため、(実際には@変数を渡しながらサイドバーをレンダリングするときにはコードの繰り返しがあります)がです。

最終的な質問は次のとおりです。カプセル化されたビューを強制することは可能ですか、より良い方法がありますか、または部分的に@variablesに直接アクセスすることは問題ありませんか?

ありがとうございました!

答えて

1

私の助言は、ヘルパーとパーシャルのインスタンス変数に頼るのを避けることです。

これは、メンテナンスやテストが直感的ではなく、難しくなります。

あなたは乾燥のために透明度を交換するべきではないので、ローカル変数の使用を続けてください。

+0

私は乾物の透明性を取引しないことに全く同意します - ありがとう! – emrass

+0

透明性または乾燥性 - なぜ両方を持たないのですか?仕事をするために別のヘルパーを追加するだけです。ここではトレードオフは必要ありません。 – RocketR

+0

この余分なロジックは機能しますが、DIY – apneadiving

1

私はこれがインスタンス変数が大丈夫な時代だと思います。サイドバーはどこに住んでいますか?私はそれに特定のモデルやコントローラがないと思うので、この部分はアプリケーションビューフォルダに存在します(または別のコントローラのビュー上でフリーローディングしています)。私はそのような部分をすべて自分のフォルダに置いています... views/globalまたは何か、それはインスタンス変数で一意のニーズを持っていることを示すのに役立ちます。

+0

のように見えます。技術的には、サイドバーはユーザーに属しています(他のモデルにはサイドバーがあります)が、まれに別のモデルのビューで表示されることがあります。あなたと無礼の議論の両方を考慮に入れて、それについてもう少し考えをした後、私は「より明確な方法」に進むことに決めました。ありがとう、あなたの考慮事項(+1) – emrass

関連する問題