複雑なフォームを扱っていると、モデルが複雑になってしまう場合があります。 そのような場合にどのような対処法があるでしょうか?
フォームオブジェクトを導入すると、モデルからフォームに関するコードを取り除くことができます。
例えば、以下のようなアルバムの情報を編集するフォームがあるとします。
アルバムのタイトルとアーティストの名前と曲のタイトルを設定できるフォームです。
アルバムのタイトルとアーティストの名前は必須項目になっています。
accepts_nested_attributes_for
を使えば、Albumモデルは以下のようなコードになります。
app/models/album.rb
class Album < ApplicationRecord
has_one :artist
has_many :songs
validates :title, presence: true
accepts_nested_attributes_for :artist, :songs
end
モデルのコードは、ネストするクラスが増えたり、バリデーションの条件が増えたりすると複雑になっていきます。
それを解決する方法の一つとして、フォームオブジェクトの導入があります。
今回はフォームオブジェクトの導入にReformというgemを使います。
変更はこのようになります。
フォームオブジェクトは以下のように設定しています。
app/forms/album_form.rb
class AlbumForm < Reform::Form
property :title
validates :title, presence: true
property :artist do
property :name
validates :name, presence: true
end
collection :songs do
property :title
end
end
フォームオブジェクト導入後のAlbumモデルは以下のようになります。
app/models/album.rb
class Album < ApplicationRecord
has_one :artist
has_many :songs
end
フォームオブジェクトを導入することによって、モデルをシンプルに保つことができました。