1979


before_actionの中で値を設定した変数をアクションの中でも使う方法ってありますか？

たとえば、before_actionにhogeを指定した状態でhugaを呼び出した時、

[code]

    before_action :hoge
    
    def hoge
        val = "abc"
    end
    
    def huga
        puts val
    end
    
[/code]

> abc

となるのを期待しているのですが、そもそも出来るんでしょうか？

クラス変数を使うのが素直？


CC BY-SA 3.0
2014-12-18T04:21:30.003
1976
2014-12-18T23:02:05.657
705
question
ruby-on-rails
Ruby on Rails で before_actionの中に定義した変数をアクションの中でも使いたい


できません。インスタンス変数を使うのが最も簡単です。

[code]

    before_action :hoge
    
    def hoge
        @val = "abc"
    end
    
    def huga
        puts @val
    end
    
[/code]

処理した内容をメモ化しておいてメソッド名でアクセスする方法もあります。

[code]

    before_action :hoge
    
    def hoge
        @val ||= "abc"
    end
    
    def huga
        puts hoge
    end
    
[/code]

before_actionで一度hogeはよばれていますが`"abc"`は一度しか生成されません。


CC BY-SA 3.0
2014-12-18T04:33:24.887
1979
2014-12-18T04:33:24.887
4643
1976
answer


before_actionはRailsのActionController::Baseクラスに含まれるメソッドに  
すぎません。

「できません」では言葉足らずかと思います、ローカル変数は名前のとおり、  
メソッド間で共有できません、インスタンス変数は同ーインスタンスの  
メソッド間で共有できます。(蛇足で言わずもがなですが、クラス変数は  
名前のとおり、 同一クラス間で共有できます。)

同一インスタンス内で共有したいのなら、インスタンス変数を使うことになります。  
同一インスタンス内で共有する目的でクラス変数を用いるべきではありません。

Rails云々の前にRubyのクラスまわりの基礎を見なおして理解することを  
オススメします。


CC BY-SA 3.0
2014-12-18T04:45:53.557
1982
2014-12-18T04:51:28.343
2014-12-18T04:51:28.343
3214
3214
1976
answer


先のお二方のご回答で十二分かと思いますが、姑事ながら一点だけ

値のキャッシングや`before_action`のためのメソッドはよほどの事が無い限り`private`にし`Controller`内（もしくはそのサブクラス）専用である事を示しておくと良いかもです.

（`before_action` と値のキャッシングを兼ねるのは別途議論が必要ですが）

[code]

    before_action :hoge
    
    def huga
      val = hoge
    end
    
    private
      def hoge
        @val ||= "abc"
      end
    
[/code]

もうご存知で、質問or回答を簡潔にするための省略でしたら失礼しました.


CC BY-SA 3.0
2014-12-18T23:02:05.657
2064
2014-12-18T23:02:05.657
3063
1976
answer