DesignAssembler

備忘録に近い

attr_internalについて

attr_internal_*はActiveSupportの機能で、名前衝突のリスクを回避してくれる機能です。

実際の機能はRubyのアクセサメソッドと同じです。

アクセサメソッドについては以下に書いています。

hyottokoaloha.hatenablog.com

あるクラスを継承したサブクラスを作るとき、クラスインスタンス変数が衝突する可能性が有ります。これを避けるために親クラスでattr_internal_*を使います。

また、attr_internalはattr_internal_accessorのエイリアスです。

実際のコードです。読むと21行目でインスタンス変数の名前にアンダーバーつけて31行目でattr_*呼んでるだけですね。

instance_eval{}で確認するとそうなっていることが分かります。

require 'active_support'
require 'active_support/core_ext'
class AttrTest
  attr_internal :test
end

> at = AttrTest.new
#<AttrTest:0x007f83f2950178>
> at.instance_eval{@test = "var"}
"var"
> at.test
nil
> at.instance_eval{@_test = "_var"}
"_var"
> at.test
"_var"

Railsのいたるところで使われています。以下はaction_mailerです。 github.com

参考

Active Support コア拡張機能 | Rails ガイド

RailsDoc - Core Ext Module