LoginSignup
1
0

More than 1 year has passed since last update.

パーフェクト Ruby on Rails 12章

Posted at

複雑なユースケースを実現する

ユースケースのロジックを分離する

アプリケーションへの機能要求が複雑になると、モデルに異なる二種類のロジックを実装するという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

すると、以下のファイルが生成されるので、こちらにメソッドを定義。

app/decorators/user_decorator.rb
module UserDecorator
  def full_name
    first_name + last_name
  end
end

view内で呼び出し

@user.full_name

プレゼンター

フォームオブジェクト

今後記載予定

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0