Rails モジュールの mattr_accessor とは何ですか?
-
06-07-2019 - |
質問
Railsのドキュメントではこれを実際には見つけることができませんでしたが、次のようです 'mattr_accessor' それは モジュール 必然的に 'attr_accessor' 通常のRubyの(ゲッター&セッター) クラス.
例えば。クラスで
class User
attr_accessor :name
def set_fullname
@name = "#{self.first_name} #{self.last_name}"
end
end
例えば。モジュール内で
module Authentication
mattr_accessor :current_user
def login
@current_user = session[:user_id] || nil
end
end
このヘルパー メソッドは次によって提供されます。 アクティブサポート.
解決
Railsは、 mattr_accessor
(モジュールアクセサー)と cattr_accessor
(および_ reader
/ _writer
バージョン)。 Rubyの attr_accessor
はインスタンスのgetter / setterメソッドを生成するため、 cattr / mattr_accessor
は class でgetter / setterメソッドを提供しますまたは module レベル。したがって:
module Config
mattr_accessor :hostname
mattr_accessor :admin_email
end
の略:
module Config
def self.hostname
@hostname
end
def self.hostname=(hostname)
@hostname = hostname
end
def self.admin_email
@admin_email
end
def self.admin_email=(admin_email)
@admin_email = admin_email
end
end
どちらのバージョンでも、次のようにモジュールレベルの変数にアクセスできます。
>> Config.hostname = "example.com"
>> Config.admin_email = "admin@example.com"
>> Config.hostname # => "example.com"
>> Config.admin_email # => "admin@example.com"
他のヒント
そして
ご覧のとおり、それらはほとんど同じです。
なぜ 2 つの異なるバージョンがあるのでしょうか?時々書きたいこともある cattr_accessor
モジュール内にあるため、構成情報として使用できます アヴディが言及したように.
しかし、 cattr_accessor
はモジュール内では機能しないため、モジュールでも機能するようにコードを多かれ少なかれコピーしました。
さらに、クラスにモジュールが含まれるたびに、そのクラス メソッドとすべてのインスタンス メソッドを取得するように、モジュール内にクラス メソッドを記述したい場合があります。 mattr_accessor
これも実行できます。
ただし、2 番目のシナリオでは、その動作はかなり奇妙です。次のコードを観察してください。特に次の点に注意してください。 @@mattr_in_module
ビット
module MyModule
mattr_accessor :mattr_in_module
end
class MyClass
include MyModule
def self.get_mattr; @@mattr_in_module; end # directly access the class variable
end
MyModule.mattr_in_module = 'foo' # set it on the module
=> "foo"
MyClass.get_mattr # get it out of the class
=> "foo"
class SecondClass
include MyModule
def self.get_mattr; @@mattr_in_module; end # again directly access the class variable in a different class
end
SecondClass.get_mattr # get it out of the OTHER class
=> "foo"