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には登録したくない平文のパスワード、トークンなどを扱いたい場合に使用します。