attr_accessorについて
Railsでは特に意識することなく、@tweet.textのように、カラム名をメソッドのように使用するとそのインスタンスが持つ値にアクセスできます。カラムに無い属性についても、attr_accessorを使うことで同じように、属性名をメソッドのように使用できるようになります。
Railsでは、カラム名やattr_accessorで定義した属性をメソッドのように使えるように、見えない部分でインスタンスの持つ値にアクセスするためのメソッドが定義されています。具体的にはActiveRecord::Baseで動的に定義してくれています。
その内部の処理について調べてまとめました。
attr_accessorとは
クラスやモジュールにインスタンス変数を読み書きするためのメソッドです。
引数には、インスタンス変数名をシンボルか文字列で指定します。
以下の例ではBookクラスにメソッドtitle、title=、price、price=を定義しています。
例)
class Tweet
attr_accessor :title, :text
end
tweet = Tweet.new(“Hello”, "hello, world!!")
puts tweet.title
tweet.text = "good morning!!"
puts tweet.text
=>Hello
=>good morning!!
*ActiveRecordを継承したクラスの場合、自動でテーブルのカラム名がプロパティとして定義されます。しかし、カラムとしては存在しないプロパティを追加するためにはattr_accessorをモデルに追加する必要があります。
attr_accessorの内部処理
引数のシンボル全てに対して以下の処理を繰り返します。
・シンボルで指定された名前のメソッドを定義します。そのメソッドはシンボルの名前の先頭に@を付加したインスタンス変数の値を取り出します。
・シンボルで指定されたメソッド名の後ろに=を付加した名前のメソッドを定義します。
例)
class Tweet
def initialize(title, text) #newすると実行
@title = title; @text = text
end
der titile #ゲッター(呼び出せるようにする)
@title
end
def title=(val) #セッター(定義できるようにする)
@title=val
end
def text
@text
end
def text=(val)
@text= val
end
end
アクセサとは
インスタンス変数にアクセスするためのものです。Rubyではそのままではインスタンス変数にアクセス出来ない仕様になっています。上記の例でいうと、以下の部分がアクセサです。
def title #ゲッター
@title
end
def title=(val) #セッター
@title=val
end
このアクセサのおかげで適切にインスタンス変数にアクセスできるようになります。
アクセサにはゲッターとセッターがあります。
ゲッターとは
ゲッターはインスタンス変数を呼び出すためのメソッドです。このメソッドにアクセスすることでインスタンス変数から値を呼び出すことができます。
def title
@title
end
セッターとは
セッターはインスタンス変数に値を定義できるようにするメソッドです。このメソッドにアクセスすることでインスタンス変数に値を持たせることができます。
def title=(val)
@title=val
end
アクセサメソッドの種類
・attr_reader(ゲッターを定義)
・attr_writer(セッターを定義)
・attr_accesor(ゲッターもセッターも定義)