質問

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"

他のヒント

ソースは次のとおりです cattr_accessor

そして

ソースは次のとおりです mattr_accessor

ご覧のとおり、それらはほとんど同じです。

なぜ 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"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top