はじめに
RubyとRailsの開発において、attr_reader
,attr_writer
,attr_accessor
は非常に便利なメソッドです。これらは、クラス内でインスタンス変数に対するゲッターおよびセッターメソッドを簡単に定義するために使用されます。
本記事では、それぞれの概念と使用方法を詳しく説明します。
概念
attr_reader
attr_reader
はインスタンス変数に対する読み取り専用のゲッターメソッドを定義します。これは、インスタンス変数の値を取得するために使用されますが、外部から値を変更することはできません。
attr_writer
attr_writer
はインスタンス変数に対する書き込み専用のセッターメソッドを定義します。これは、インスタンス変数の値を外部から設定するために使用されますが、値を取得することはできません。
attr_accessor
attr_accessor
はインスタンス変数に対するゲッターおよびセッターメソッドを両方定義します。これにより、インスタンス変数の値を取得および設定することができます。
使用方法
attr_reader
attr_reader
は、指定されたインスタンス変数に対する読み取り専用のゲッターメソッドを定義します。これにより、インスタンス変数の値を外部から取得できるようになりますが、値を変更することはできません。
class Person
attr_reader :name
def initialize(name)
@name = name
end
end
person = Person.new("Alice")
puts person.name
# => Alice
person.name = "Bob"
# => undefined method `name=' for #<Person:0x00007ff7ca0a93d8>
上記のコードでは、attr_reader :name
によって@name
インスタンス変数に対するゲッターメソッドname
が自動的に定義されます。これにより、person.name
で@name
の値を取得できます。しかし、person.name = "Bob"
のように値を変更しようとするとエラーが発生します。
attr_reader :name
は以下のメソッド定義と同義です。
def name
@name
end
attr_writer
attr_writer
は、指定されたインスタンス変数に対する書き込み専用のセッターメソッドを定義します。これにより、インスタンス変数の値を外部から設定できるようになりますが、値を取得することはできません。
class Person
attr_writer :age
def initialize(age)
@age = age
end
def display_age
"Age: #{@age}"
end
end
person = Person.new(30)
puts person.display_age
# => Age: 30
person.age = 35
puts person.display_age
# => Age: 35
上記のコードでは、attr_writer :age
によって@age
インスタンス変数に対するセッターメソッドage=
が自動的に定義されます。これにより、person.age = 35
で@age
の値を設定できます。しかし、person.age
のように値を取得しようとするとエラーが発生します。
attr_writer :age
は以下のメソッド定義と同義です。
def age=(value)
@age = value
end
attr_accessor
attr_accessor
は、指定されたインスタンス変数に対するゲッターメソッドとセッターメソッドの両方を定義します。これにより、インスタンス変数の値を外部から取得および設定できるようになります。
class User
attr_accessor :email
def initialize(email)
@default_domain = "example.com"
self.email = email
end
def email_with_domain
"#{email}@#{@default_domain}"
end
end
user = User.new("user1")
puts user.email
# => user1
user.email = "user2"
puts user.email
# => user2
puts user.email_with_domain
# => user2@example.com
上記のコードでは、attr_accessor :email
によって@email
インスタンス変数に対するゲッターメソッドemail
とセッターメソッドemail=
が自動的に定義されます。これにより、user.email
で@email
の値を取得し、user.email = "user2"
で値を設定できます。
attr_accessor :email
は以下の2つのメソッド定義と同義です。
def email
@email
end
def email=(value)
@email = value
end
Railsでの使用方法
Railsのモデルでは、attr_accessor
を使用して仮想属性を定義することができます。仮想属性とは、データベースには保存されないが、モデルのインスタンス変数として扱う属性のことです。例えば、ユーザーのパスワードを平文で受け取り、保存する前にハッシュ化する場合に使用します。
app/models/user.rb
class User < ApplicationRecord
attr_accessor :password
before_save :encrypt_password
def encrypt_password
self.encrypted_password = Digest::SHA256.hexdigest(password) if password.present?
end
end
user = User.new(password: "secret")
user.save
puts user.encrypted_password
# => (暗号化されたパスワード)
上記のコードでは、attr_accessor :password
によって@password
インスタンス変数に対するゲッターメソッドとセッターメソッドが定義されます。before_save
コールバックを使用して、ユーザーが保存される前にencrypt_password
メソッドを実行し、password
の値をハッシュ化してencrypted_password
に保存します。
まとめ
attr_reader
,attr_writer
,attr_accessor
は、RubyおよびRailsの開発においてインスタンス変数のゲッターおよびセッターメソッドを簡単に定義するための便利なメソッドです。これらを適切に活用することで、コードの可読性とメンテナンス性を向上させることができます。