【Rails】RubyとRailsにおけるattr_reader, attr_writer, attr_accessorの概念と使用方法

はじめに

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の開発においてインスタンス変数のゲッターおよびセッターメソッドを簡単に定義するための便利なメソッドです。これらを適切に活用することで、コードの可読性とメンテナンス性を向上させることができます。

関連記事

【Rails】Paranoiaを使用した論理削除(ソフトデリート)
# はじめに Paranoiaは、Railsアプリケーションで論理削除(ソフトデリート)を実現するためのGemです。 論理削除は、データベースのレコードを物理的に削除するのではなく、削除フラグを設定することで「削除済み」とみなす方法です。こ [...]
2024年7月20日 21:33
【Rails】activerecord-multi-tenantを使用したマルチテナントアプリケーションの作成
# はじめに マルチテナントアプリケーションでは、複数の顧客(テナント)が同じアプリケーションを利用するため、データの分離が必要です。 activerecord-multi-tenantは、このようなマルチテナント環境をサポートするための便 [...]
2024年7月18日 16:50
【Rails】RubyとRailsにおけるyieldの概念と使用方法
# はじめに RubyとRailsにおける`yield`は、メソッドやテンプレートの中で動的にコードブロックを実行する能力を提供し、これによってコードの再利用性と拡張性が大幅に向上します。本記事では、RubyとRailsにおける`yield`の概 [...]
2024年7月17日 13:15
【Rails】AASMを使用してオブジェクトの状態遷移を効率的に管理
# はじめに Railsアプリケーションにおいて、オブジェクトの状態管理は重要な課題の一つです。AASM (Acts As State Machine) gemは、複雑な状態遷移を効率的に管理します。本記事では、AASMの基本的な使い方を解説して [...]
2024年7月16日 18:00
【Rails】RSpec + Swagger + rswagでアプリケーションのAPIをテストおよびドキュメント化する方法
# はじめに Railsアプリケーションの開発において、APIのテストとドキュメント化は重要な要素です。 RSpecはテストフレームワークとして広く利用されており、SwaggerはAPIの設計とドキュメント化を支援します。これらを統合するr [...]
2024年7月16日 14:27
【Rails】mailcatcherを使用して開発環境でメール送信をテストする方法
# はじめに mailcatcherは、開発環境でのメール送信をキャプチャするためのツールです。ローカルで送信されたメールをブラウザ上で簡単に確認できるようにします。mailcatcherをRailsアプリケーションで使用する方法について説明しま [...]
2024年7月15日 16:37
【Rails】impressionistを使用してページビューやクリック数を追跡する方法
# はじめに impressionist Gemを使用してRailsアプリケーションでページビューやクリック数を追跡する方法について説明します。 # 実装方法 ## impressionist Gemのインストール まず、impre [...]
2024年7月15日 14:18
【Rails】meta-tagsを使用したメタタグの管理
# はじめに RailsアプリケーションでSEO対策を行うために、meta-tags Gemを使用してメタタグを管理する方法について説明します。 # メタタグの管理 ## meta-tags Gemのインストール まず、meta-t [...]
2024年7月15日 13:47