複雑なユースケースを実現する
ユースケースのロジックを分離する
アプリケーションへの機能要求が複雑になると、モデルに異なる二種類のロジックを実装するという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が提供するモジュール群の一部をまとめたモジュール
複数のモジュールを組み合わせて、コントローラやビューのメソッドとの連携に必要なインターフェースを提供
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
すると、以下のファイルが生成されるので、こちらにメソッドを定義。
module UserDecorator
def full_name
first_name + last_name
end
end
view内で呼び出し
@user.full_name
プレゼンター
フォームオブジェクト
今後記載予定