Edited at

Railsから入った人へ【attr_accessor】って?


こっちを参考にしてください

この記事もとても分かりやすいです。

Rubyのattr_accessorって何?[和訳]

http://bryankawa.hatenablog.com/entry/2017/01/28/150537


まとめ

migrationでオブジェクトのもつ属性を定義することと(✭ほぼ)同義

書き込みも読み込みもできる。

✭ migration で定義した型は静的だが、attr_accessorの型は動的に決まる


良くある説明

def title=(t)

@title = t
end

def title
@title
end

attr_accessor :title

と短く書ける。。。

最初見た時、すんなり理解できました?

私は3時間ぐらい空を仰ぎました。

改めて、Railsのmigrationと比較して考えたらスッキリしたのでまとめます。


RailsからRubyに入った人への説明

例えば、name,descriptionという属性を持つUserオブジェクトを定義しようとすると


db/migrate/20160304060143_create_users.rb

class CreateUsers < ActiveRecord::Migration

def change
create_table :users do |t|
t.string :name
t.string :description

t.timestamps null: false
end
end
end


Railsでは上記の様な migration ファイルを作成しますが

DBを扱わない純粋なRubyのコードでは、

class User

attr_accessor :name, :description
end

と書くことが出来ます!!

↑の migration ファイルの場合、name, description の型は String 型から変わらない

つまり、どちらも

user = User.new

user.name = "hassan"

このようにオブジェクトの属性に値を代入することができる。

attr_accessor は、型に縛られず値を入れることができます。

(テーブルのカラム=オブジェクトの属性)をクラスの中で定義しているイメージ。

この路線から入る場合、

attr_accessorの型はどうなっているのか確認してみよう。


確認

class User

attr_accessor :name, :description

def print_upcase
puts name.upcase
end
end

user = User.new

=> #<User:0x007fb7f9bbd2b8>

user.name = "hassan"
=> "hassan"

user.description = "将来有望"
=> "将来有望"

user.name = true
=> true

user.name = 12
=> 12

user.print_upcase
NoMethodError: undefined method `upcase' for 12:Fixnum

user.name = "hassan"
=> "hassan"

user.print_upcase
=> HASSAN

型は動的です(ここで、良くある説明のコードを見なおしてみると納得)


attr_accessorの利用用途

・読み取りも書き込みもできるオブジェクトの属性を定義したい時

ちなみに attr_reader は読み出し専用の属性を定義したいときに使い、

attr_writer は書き込み専用の属性を定義したいときに使う。


補足

厳密には migration は DB のテーブルとカラムを定義するときに使っていますが、Rails では対応する Model を作成すると明示的に attr_accessor を定義しなくてもテーブルのカラムを属性として扱えます。