LoginSignup
288
204

More than 3 years have passed since last update.

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

Last updated at Posted at 2016-03-09

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

この記事もとても分かりやすいです。
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 を定義しなくてもテーブルのカラムを属性として扱えます。

288
204
1

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
288
204