Skip to content

Instantly share code, notes, and snippets.

@tagty
Last active October 24, 2019 23:58
Show Gist options
  • Save tagty/d05edd6ae891a5cfbb1feeadf46ba79f to your computer and use it in GitHub Desktop.
Save tagty/d05edd6ae891a5cfbb1feeadf46ba79f to your computer and use it in GitHub Desktop.
Reformを使ってモデルをシンプルに保つには?

複雑なフォームを扱っていると、モデルが複雑になってしまう場合があります。 そのような場合にどのような対処法があるでしょうか?

フォームオブジェクトを導入する

フォームオブジェクトを導入すると、モデルからフォームに関するコードを取り除くことができます。

フォームオブジェクトを使わない場合

例えば、以下のようなアルバムの情報を編集するフォームがあるとします。

アルバムのタイトルとアーティストの名前と曲のタイトルを設定できるフォームです。

新規登録ページ

new

詳細ページ

show

アルバムのタイトルとアーティストの名前は必須項目になっています。

validation

クラス図

class

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を導入する

今回はフォームオブジェクトの導入に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

フォームオブジェクトを導入することによって、モデルをシンプルに保つことができました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment