12章
ユースケース
ユースケースとは、何らかの目的を達成するために行われる、ユーザーとアプリケーションの間の一連のやり取りを示したもの。
「GitHubアカウントでログインする」「イベントを登録する」などがユースケース。
「GitHubでログインボタンをクリックするとGitHubアプリケーション認証画面に遷移する」「イベント登録フォームで間違った入力をするとエラーメッセージが表示される」などがユーザーとアプリケーションの間のやり取り。
Webアプリケーションでは、HTTPを介してユーザーとアプリケーションのやり取りが行われる。
RailsはURLで表されるリソースをデータベースのテーブルと1対1に対応させており、これらのCRUD操作を通じてユーザーとやり取りをする。
1つまたは複数のCRUD操作によって1つのユースケースが構成される。
→1アクション1ユースケース。「あなた(ユーザー)が何かをしたら、わたし(アプリ)も何かをするよ」
Railsのレール
Railsでは、モデルのCRUD操作の前後に実行される処理を追加する(代表的なものがバリデーションとコールバック)ことでユースケースを実現している。
単純なアプリではデータベースとモデルとコントローラが(大体)1対1対1なのはそういうこと。
「同意する項目にチェックを入れているか検証する」「ユーザー登録が完了したらメールを送信する」などは、特定のユースケースに固有のものであり、ドメインロジックとは異なる種類のロジック。
しかーーーし、あるテーブルやデータ操作が複数のユースケースで行われるようになると、on
とかif
オプションを駆使することになってつらみが生まれる。
また、テーブルがないリソース(Cookieとか)のCRUD操作をすることも出てくる。
そんな問題を解決するために……
新しいレイヤーを導入してユースケースのロジックをモデルから分離する。
ActiveModel
素のRubyクラスにActiveRecordと同様のインターフェースや機能を追加できる。
→データベースと紐付かないモデル
ActiveModel::Attributes
型をもつ属性の定義を容易にする。
自動で型変換が行われる。
|
|
ActiveModel::Callbacks
define_model_callbacks :save
でコールバック対象とするメソッドsave
を定義すると、before_save
, around_save
, after_save
が利用できる。
一部のみ使用する場合はonly
オプションを指定する。
|
|
ActiveModel::Serialization
オブジェクトのシリアライズ機能。
オブジェクトをハッシュに変換するserializable_hash
メソッドだけが提供される。
(省略)
ActiveModel::Validations
属性のバリデーションを容易にする。
データベースのレコードを参照するヘルパー以外はActiveRecordと同じものを使える。
before_validation
を使用するためにはActiveModel::Validations::Callbacksのincludeも必要。
|
|
ActiveModel::Model
ActiveModelが提供するモジュール群をひとまとめにしたもの。
コントローラやビューのメソッドとの連携に必要なインターフェースを提供する。
|
|
フォームオブジェクト
(以下省略。いつか書く)