パーフェクト Ruby on Rails 12章

# 複雑なユースケースを実現する
ユースケースのロジックを分離する

アプリケーションへの機能要求が複雑になると、モデルに異なる二種類のロジックを実装するというRailsのアプローチが機能しなくなる。
=> Active Modelを利用する。

# Active Modelとは
モデルに関するモジュール群を提供するライブラリで、ActiveRecordの実装に利用される。
これを利用することで、自分で定義した素のRubyクラスにもActiveRecordと同等のインターフェースや機能を追加できる。要は、データベースと紐づかないモデルを作ることができる。


## ActiveModel：：Attributes
型を持つ属性の定義を簡単にしてくれるモジュール

```
class Person
 include ActiveModel::Attributes

attribute :name, :string
attribute :age, :integer
end
```
```
pesron = Person.new
person.name = "David"
=> "David"
person.name
=> "David"
person.age = "40"
=> "40"
person.age
=> "40"
```

ActiveModel::Attributesをincludeするだけで、属性を定義するためのattributeメソッドを利用できるようになる。attributeメソッドでは、第一引数で属性名を、第二引数で型名を指定する。

|指定できる型名|
|:-:|
| big_integer  |
| binary  |
| boolean  |
|date   |
|datetime   |
|decimal  |
|float  |
|immutable_string   |
|string  |
|time   |

属性にデフォルト値を設定したい場合には、defaultオプションで値または値を返すProcオブジェクトを指定する。
```
attribute :width, :integer, default:0
```

# ActiveNodel::Callbacks
コールバック機能の実装を容易にしてくれるモジュール

以下の3つのコールバックが使用可能になる。
* before
* around
* after

```
class Pesron
  extend ActiveModel::Callbacks
  define_model_callbacks :save, only: %i[after, before]

  def run
    run_callbacks :save do
      true # saveメソッドの中身をここに記述する
    end
  end
end
```

## ActiveModel::Serialization
オブジェクトのシリアライズ機能の実装を簡単にしてくれるモジュール
今後追記予定


## ActiveModel::Validations
属性のバリデーション機能の実装を簡単にしてくれるモジュール
```
class Person
  include ActiveModel::Validations
  
  attr_accessor :name
  
  validates :name, presence: true, length: { maximum: 1 }
end
```
```
person = Person.new
pereson.name = "David"
=> 保存できない
```

### ActiveModel::Validationsのヘルパー
| ヘルパー |
|:-:|
|absence|
|acceptance |
|confirmation|
|exclusion|
|format|
|inclusion|
|length|
|numericality|
|presence|

## ActiveModel::Model
ActiveModelが提供するモジュール群の一部をまとめたモジュール
複数のモジュールを組み合わせて、コントローラやビューのメソッドとの連携に必要なインターフェースを提供

:::note info
ActiveModel::Modelモジュールは、RailsのActiveModelという機能を使って、Active Record以外のオブジェクトを扱う際に便利な機能を提供するものです。

具体的には、ActiveModel::Modelをincludeすることで、以下のような効果が得られます。

・属性の定義やバリデーションが簡単に実現できる
ActiveModel::Modelをincludeすることで、属性を定義したり、バリデーションを設定したりすることができます。これにより、Active Recordのようなオブジェクトでも、簡単に属性やバリデーションを定義することができます。
```
class MyModel
  include ActiveModel::Model
  attr_accessor :name, :email

  validates :name, presence: true
  validates :email, presence: true, format: { with: URI::MailTo::EMAIL_REGEXP }
end
```

・Active Recordと同様のメソッドが使える
ActiveModel::Modelをincludeすることで、Active Recordと同様に、save, update, destroyなどのメソッドを使うことができます。これにより、Active Recordと同じようにオブジェクトを永続化したり、更新したりすることができます。

```
my_model = MyModel.new(name: "John", email: "john@example.com")
my_model.save #=> true
my_model.update(name: "John Smith") #=> true
```

・Active Recordの関連機能を使える
ActiveModel::Modelをincludeすることで、Active Recordの関連機能（belongs_to, has_one, has_manyなど）を使うことができます。これにより、Active Recordのようにオブジェクト間の関連を表現することができます。
```
class User
  include ActiveModel::Model
  has_many :posts
end

class Post
  include ActiveModel::Model
  belongs_to :user
end

user = User.new
post = Post.new(user: user)
post.user #=> user
```
ActiveModel::Modelを使うことで、Active Record以外のオブジェクトでも、Active Recordのような機能を使うことができるため、Railsアプリケーションの構築や拡張に役立ちます。
:::

# ActiveDecorator
Ruby on Railsでデコレーターパターンを実装するための他の一般的なGemにActiveDecoratorがある。

これはモデルやコントローラーにメソッドを書くと可読性が落ちるので、切り分ける方法。
```
#Gemfile
gem 'active_decorator'
```

Decoratorを作成
```
rails g decoratore user
```

すると、以下のファイルが生成されるので、こちらにメソッドを定義。
```app/decorators/user_decorator.rb
module UserDecorator
  def full_name
    first_name + last_name
  end
end
```

view内で呼び出し
```
@user.full_name
```

# プレゼンター
# フォームオブジェクト
今後記載予定