コントローラーのインスタンス変数がビューで機能しないのはなぜですか(Rails)

StackOverflow https://stackoverflow.com/questions/1412650

質問

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

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回実行したくありません。なぜ私の方法が機能しないのですか?

(注:これはちょっとしたゴミの例ですが、意味があると思います)

編集:この質問に対する答えはここにあります: When do Rubyインスタンス変数が設定されますか

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

役に立ちましたか?

解決

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

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で

他のヒント

これらはインスタンス変数ではありませんか?

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

A.new.f
=> nil

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top