2010-12-16 6 views
0

私は私のコントローラに@sort_by属性を追加し、それがこのような値だ初期化:Rails:デフォルトのアプリケーションレイアウトが使用されないのはなぜですか?

class ProductsController < ApplicationController 
    def initialize 
    @sort_by = :shop_brand 
    end 
    ... 
end 

これは使用されないデフォルトのアプリケーションのレイアウトを引き起こしました。

なぜですか?

コントローラに属性を追加して初期化する正しい方法は何ですか?

答えて

6

コンストラクタをオーバーライドすることはおそらく(あなたが見つけたように)悪い考えです。あなたはbefore_filterを使用する必要があります。

class ProductsController < ApplicationController 

    before_filter :set_defaults 

    ... 

    private 

    def set_defaults 
    @sort_by = :shop_brand 
    end 

end 

しかし、あなたは状態を維持したいのように聞こえます。

def set_defaults 
    session[:sort_by] ||= :shop_brand 
end 

他のオプションはURLで現在sort_by値を渡すために、次のようになります。最も簡単な彼らは、ブラウザを閉じるまで、自動的にユーザーごとに保持されますユーザーのセッションに格納することです。これは実装するのが難しいですが、各リンクやフォームが次の要求に値をコピーするようにする必要があるためです。しかし、これの利点は、ユーザーが異なる順序で複数のタブを開くことができ、ブックマークされたリンクが次回同じ順序を復元することにあります。これは、検索エンジンのようなものが使用するアプローチです。

+0

'sort_by'が決して変更されない場合、クラスの基底で定数' SortBy'としてうまくいくでしょう:) – Matchu

+0

'sort_by'は変更される可能性がありますので、定数にすることはできません。さらに、あなたのコードでは '@ sort_by'が各アクションの前に設定されますが、デフォルト値(':shop_brand')を一度しか設定しません! 'index'メソッドが呼び出されるたびにデフォルト値を設定したくありません! –

+0

さて、私は '@sort_by || =:shop_brand'をやることができると思いますが、たびに' set_defaults'を呼び出さないもっと良い方法があるのだろうか? –

関連する問題