Help us understand the problem. What is going on with this article?

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 を定義しなくてもテーブルのカラムを属性として扱えます。

Hassan
フリーランスの Web エンジニアです。Twitter でフォローしてください。
https://hassansan.me
campfirejp
国内最大の流通を誇るクラウドファンディングサービス「CAMPFIRE」の企画・開発・運営を行うスタートアップです
https://camp-fire.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした