Ruby
Rails

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

More than 1 year has passed since last update.


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

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

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ファイルを作成しますが

純粋な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の利用用途

・オブジェクトの属性を定義したい時

・(gemを作成する時、DBにアクセスする必要がない時)