LoginSignup
0
0

More than 1 year has passed since last update.

Activemodel::modelをincludeした際のinitializeの挙動について

Posted at

挨拶

こんにちは、プレイライフの熊崎です!
最近はあったかくなって、お出かけ日和ですね!
コロナでなければ、どこかお出かけにでも行きたい気分なのですが、こんなご時世なので粛々と学習のアウトプットをしていきたいと思います笑

背景

今回、実務でフォームオブジェクトを作ることになり、その際にinitializeメソッドを使いました。
自分でフォームオブジェクトを作るにあたって、既存のフォームオブジェクトのソースリーディングを行っていました。その際に既存のコードが以下のような感じだったが、どのような挙動をしているかわからなかったので、まとめました。

コード例(一部コードを省略しております。)

hogehoge.rb
Class hogehoge
  include ActiveModel::Model

  def initialize(name, attributes = {})
    @name = name
    super(attributes)
  end
end

superとは

スーパークラス(親クラス)のメソッドを呼び出す。
引数がついている場合は、引数つきでそのメソッドを実行する。

今回の場合は、、、

Activemodel::Modelのinitializeメソッドを呼び出す。

Activemodel::Modelのinitializeはどうなってるか?

以下、公式のgithubリポジトリから引用

model.rb
def initialize(attributes = {})
  assign_attributes(attributes) if attributes

  super()
  # ここのsuper()は正直理解できておりません、、、 どなたかご存知の方がいらっしゃれば、コメントなどを頂けますと幸いです。
  end
  # assign_attributesメソッドは、Activemodel::Modelがインクルードしている、ActiveModel::AttributeAssignmentに入っています。

ActiveModel::modelのintializeメソッドに、assign_attributesメソッドがあって、attributes内に入っている属性を変更してくれている。ということでした1

assign_attributesメソッド

複数の属性を変更したいときに使用される
https://qiita.com/tyamagu2/items/8abd93bb7ab0424cf084

最後に

まだまだ未熟ゆえに、間違っていることを書いていることもあると思います。(なるべくそのようなことのないよう、気をつけてはおりますが、、、)
もし、間違い等ございましたらコメントにてご指摘いただけますと幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0