6

問題の変数は複数のアクションのビュー内から必要とされるため、いくつかのインスタンス変数をコントローラーに追加したいと思います。ただし、次の例は期待どおりに機能しません。

class ExampleController < ApplicationController
  @var1 = "Cheese"
  @var2 = "Tomato"

  def show_pizza_topping
    # What I want is the above instance vars from within the view here
  end

  def show_sandwich_filling
    # What I want is the above instance vars from within the view here
  end
end

私が理解しているように、Rails はコントローラーからインスタンス変数を取得し、それらをビューで使用できるようにします。アクション メソッド内で同じ変数を割り当てると、問題なく動作しますが、2 回はしたくありません。なぜ私のやり方はうまくいかないのですか?

(注:これはちょっとばかげた例ですが、意味があることを願っています)

編集: ここでこの質問に対する答えを見つけました: Ruby インスタンス変数はいつ設定されますか?

編集 2: before_filter や初期化メソッドなどのフィルターを使用するのに最適な時期はいつですか?

4

2 に答える 2

10

これらのタイプのものは、 で処理する必要がありbefore_filterます。名前が示すように、前フィルターは、アクションの前、または宣言したアクションのみが呼び出されるメソッドです。例:

class ExampleController < ApplicationController

  before_filter :set_toppings

  def show_pizza_topping
    # What I want is the above instance vars from within the view here
  end

  def show_sandwich_filling
    # What I want is the above instance vars from within the view here
  end

protected

  def set_toppings
    @var1 = "Cheese"
    @var2 = "Tomato"
  end

end

または、 before_filter をアクションの 1 つだけで機能させることもできます

before_filter :set_toppings, :only => [ :show_pizza_topping ]

お役に立てれば。

編集: ActionController のフィルターに関する詳細情報は次のとおりです。

于 2009-09-11T18:53:13.803 に答える
2

それらはインスタンス変数ではありませんね。

class A
  @x = 5
  def f
    puts @x
  end
end

A.new.f
=> nil

インスタンスレベルではなく、クラスレベルで定義しています。「theIV」が指摘するように、インスタンス メソッド内でそれらを割り当てる必要があります。

于 2009-09-11T18:55:07.313 に答える