前回同様、タスクアプリケーションに機能を追加していきます。
今回はコールバックを実装し、モデルの状態を自動的に制御できるようにします。
コールバックとは
コールバックとは後で呼びたい処理をあらかじめ指定しておく仕組みを指します。
Railsのコールバックでは、モデルにおけるデータの登録、更新、削除というようなライフサイクルの前後のタイミングで、任意の処理をいくつでも呼び出せます。
メリット
- ・イベントに対してメソッドを共通化できる。
- ・汎用性の高い処理をカプセル化する事でメンテナンスとテストがしやすくなる。
デメリット
- ・複数モデルで共通のコールバック処理を変更する際、モデルによっては不都合が生じる可能性がある。
- ・アクションとセットになってコールされるため、想定外の値が保存されるなどの恐れがある。
コールバック処理の種類
ActiveRecordモデルに対して、どのイベントの前後にどのような種類のコールバック処理を置けるかは以下の通りです。

ActiveRecordモデルのコールバックは、検証、登録、更新、削除といった主なイベントに対して前(before)、後(after)、イベントを挟む(around)といった3つのタイミングで書くことができます。
前回、不正なデータがデータベースに登録されないよう防ぐためにバリデーションを追加しましたが、コールバックを使うことで不正なデータに対処することができます。
それは「不正なデータが入ってきた場合に自動的に正しいデータに変更する方法」です。
例) タスクの名前が入力されていない時に「名前なし」という名前を自動でつける処理を足すことで、ひとまずは「名前なし」で登録し、未入力を防ぐことができます。
コールバックの実装
タスク名が未入力だった際に、コールバックを使って「名前なし」を自動でつけたいと思います。ただし、今後の機能追加などに影響が出ないように最終的にタスクアプリケーションには変更を反映しません。
まず登録時に起きるイベントは以下の通りです。
- 1. Taskオブジェクトが生成される
- 2. nameが代入される
- 3. nameが検証される
- 4. 登録される
「名前なし」を自動でつける処理は2と3の間に入れます。
検証の前ニコールバックが必要となるため、before_validationコールバックを追加します。
Taskモデル(app/models/task.rb)を以下のように変更します。
class Task < ApplicationRecord
before_validation :set_nameless_name
・・・
private
def validate_name_not_including_comma
errors.add(:name, 'にカンマを含めることはできません') if name&.include?(',')
end
def set_nameless_name
self.name = '名前なし' if name.blank?
end
end
以上でnameが未入力の時に「名前なし」をつけるコールバックを実装できました。
終わりに
今回はRailsのコールバックについて学び、タスク管理アプリケーションに実装しました。
次回からはタスク管理アプリケーションにログイン機能を実装します。
コメント