2012-01-15 9 views
0

私は多くのモデルを持つレールアプリを構築しています。その1つはアイテムです。レールにアプリケーション全体の部分とその変数を定義する正しい方法は何ですか

商品には、製品とサポート情報の短いリストが含まれています。

この情報をアプリのすべてのページに表示する必要があります。私の見解で

私は

<%= render @items %> 

を追加し、このすべての作業を取得するために、部分的に「アイテム/ _item.html.erb」今

を追加しました、私も定義する必要があります変数

@items = Item.all 

私の質問は、この変数を定義する正しい方法は何ですか?私はすべてのコントローラのすべてのビューにこの行を追加することができますが、それはあまり乾燥していないようです。

これをアプリケーションコントローラで定義する必要がありますか?もしそうなら、アイテムインデックスページへのアクセスを維持したい場合は、これにより問題が発生するでしょうか?

申し訳ありませんが、これは簡単な質問です。私は最良のアプローチを考えようとしており、この事件についてはあまり書かれていない。新鮮なアイデアや視点に感謝します!

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

答えて

3

ビューからデータベースを呼び出さないでください。

アプリケーションコントローラ内でプライベートメソッドを作成し、@itemsコレクションが必要なすべてのコントローラのbefore_filterとして使用できます。私が一番簡単な方法は、(我々は「items_box」と呼んで言わせて)新しい部分を構築することだと思います

before_filter :load_items, :only => [:show, :edit, update] 
+0

ありがとう@taroこれは私が探していたものです。方法を教えてくれてありがとう。私は 'before_filter:load_items'をアプリケーションコントローラに加え、この' def load_items @items = Item.all end'の下に追加しました。魅力的な作品! –

0

:よう おそらく、あなたは、@itemsが取り込まれるべきアクションをカスタマイズする必要があります。 items/_items_box.html.erbでは、Item.allとして@itemsを定義し、必要なレンダリングコードを提供します。それでは<%= render @items %>から<%= render 'items/items_box' %>に変更するだけです。

+0

ありがとう、私が遭遇した問題は、部分的に@itemsをどのように定義するのか分かりませんでした。あなたはこれをどうやってやろうか教えてくれませんか?おかげです。 –

+0

あなたがこのようにするつもりならば、あなたの '_items_box.html.erb 'の一番上にある' <%= @items = Item.all%> ' 'ファイル。しかし、私は太郎のアプローチがよりクリーンなアプローチだと思う。 Viewレイヤーがデータベース要求を処理すべきでないという点で彼は正しいです。:) –

1

何かを表示する必要がある場合は、すべてのコントローラではなく、アプリケーションコントローラで行うことを検討する必要があります。あなたは同じフォルダ(つまりレイアウト)に部分を持っている、とレイアウトでそれを呼び出すことができます

<%= render :partial => 'partial_name' %> 

として表示と、アプリケーションレベルでこれをやったから、私はあなたが必要だろうとは思いませんこの部分をアプリ内のどこからでもレンダリングすることができます。

+0

ありがとうwahaj、私はまた、これはアプリケーションコントローラで処理する必要があると感じ、ちょうどそれを行う方法を解明することができませんでした。太郎の提案は、私が正しい線に沿って考えるようになった –

関連する問題