attr_accessorについて

attr_accessorとは?

ゲッター 、セッターをまとめて作成してくれるやつです!!

ゲッター、セッターとは?

ゲッター:インスタンス変数の中身を参照する為に使用します。
セッター:インスタンス変数の中身を変更する為に使用します。

class User
# ゲッター
  def name
    @name
  end

# セッター
  def name=(name)
    @name = name
  end
end

以下のような結果になります。

> user = User.name
> p user.name
=> nil
> p user.name=("Tanaka")
=>"Tanaka"
> p user.name
=>"Tanaka"

もっと省略したい! => attr_**メソッド

ゲッター、セッターを省略できるようにメソッドが準備してあります。 それが「attr_reader」,「attr_writer」です。 先程のクラス内を変更すると

class User
  attr_reader :name
  attr_writer :name
end

更に省略できるのが「attr_accessor」です。

class User
  attr_accessor :name
end

ちなみに...

セッターを使用する際に以下のように書きました。

>user.name=("Tanaka")

rubyの慣習として以下のようなものがあります。
1.メソッド名の最後が=の場合、=の前にスペースを空けれる。
2.引数の括弧は省略できる。
3.引数の最後がハッシュの場合、{}は省略できる。
これを適用してみると

>user.name = "Tanake"
# あたかも変数に代入しているかのように表すことができる!!

Railsでの使われ方

自分のような初学者は、特にModel部で使用することになると思います。
ちなみにUsersテーブルにname属性がある場合、以下のような書くと思います。

> user = User.new
> user.name
> user.name = "hoge"

このように書けるのはActiveRecord::Base」を継承しているからです。
ActiveRecord::Baseのおかげで、各属性に紐づいたゲッター、セッターを使用することができます。

仮想的な属性を使用したい時

DBには紐付けたくない属性を使用した場合にも、attr_accessorは使用されます。

class User < ApplicationRecord
  attr_accessor :remember_token
end

上記のようにすると、Userモデルに「remember_token」という仮想的な属性を追加できます。 Usersテーブルには追加されません。
DBには登録したくない平文のパスワード、トークンなどを扱いたい場合に使用します。