89339


railsで下記のようなコードを見かけて `current_xxx`
がどこから来ているか知りたくて下のような原理で成り立っているのか確認したく質問しました。

module hoge.rb

[code]

    module hoge
     private
     def hogehge
       @current_user = なんらかの処理
     end
    
     def hogehge2
       @current_xxx = なんらかの処理
     end
    
    ...
    
[/code]

上記のimport？している。  
application_controller.rb

[code]

    class ApplicationController < ActionController::API
     # コードがある。
     include hoge
    
     private
     attr_reader :current_user, :current_xxx, :current_xxx, :current_xxx  ...
    
[/code]

この場合moduleに記述された `@current_user`, `@current_xxx` に `application_controller.rb`
からアクセス出来るのでしょうか？  
Ruby詳しい方、教えて頂けると幸いです。  
宜しくお願い致します。


CC BY-SA 4.0
2022-06-08T22:50:24.200
89297
2022-06-11T18:36:16.567
22565
question
ruby-on-rails ruby
rubyのmoduleに記述されたインスタンス変数は読み込み先で参照できる？


`ApplicationController` のインスタンスに属している `@current_user` が常に参照されています。

まず、`attr_reader :current_user` は `@current_user` の内容を読んで返すメソッドを定義するのと同じです:
<https://docs.ruby-lang.org/ja/latest/method/Module/i/attr_reader.html>

[code]

    def current_user
      @current_user
    end
    
[/code]

そして `@current_user`
はインスタンス変数です。インスタンス変数は各々のオブジェクトに属する概念であり、クラスに属するものやモジュールに属するものではありません:
<https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#instance>

したがって、それぞれの `ApplicationController` インスタンスに対して `hogehoge` が実行されればそのインスタンスの
`@current_user` に代入されますし、`current_user` が実行されればそのインスタンスの `@current_user`
が読まれます。モジュールではなくてオブジェクト単位の話になっていることに注意すると理解しやすいかなと思います。

参考：英語版 Stack Overflow での類似質問 <https://stackoverflow.com/q/15478747/5989200>


CC BY-SA 4.0
2022-06-11T18:36:16.567
89339
2022-06-11T18:36:16.567
19110
89297
answer