コントローラーのインスタンス変数がビューで機能しないのはなぜですか(Rails)
-
06-07-2019 - |
質問
問題の変数は複数のアクションのビュー内から必要なので、コントローラーにインスタンス変数をいくつか追加したいと思います。ただし、次の例は期待どおりに機能しません。
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 ]
これがお役に立てば幸いです。
他のヒント
これらはインスタンス変数ではありませんか?
class A
@x = 5
def f
puts @x
end
end
A.new.f
=> nil
インスタンスレベルではなく、クラスレベルで定義しています。 「theIV」として指摘するように、それらをインスタンスメソッド内で割り当てる必要があります。
所属していません StackOverflow