attr_accessorについて

 

Railsでは特に意識することなく、@tweet.textのように、カラム名をメソッドのように使用するとそのインスタンスが持つ値にアクセスできます。カラムに無い属性についても、attr_accessorを使うことで同じように、属性名をメソッドのように使用できるようになります。

Railsでは、カラム名やattr_accessorで定義した属性をメソッドのように使えるように、見えない部分でインスタンスの持つ値にアクセスするためのメソッドが定義されています。具体的にはActiveRecord::Baseで動的に定義してくれています。

その内部の処理について調べてまとめました。

 

 

 

attr_accessorとは

クラスやモジュールにインスタンス変数を読み書きするためのメソッドです。

引数には、インスタンス変数名をシンボルか文字列で指定します。

以下の例ではBookクラスにメソッドtitletitle=priceprice=を定義しています。

例)

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(ゲッターもセッターも定義)