Rails Formオブジェクトまとめ

背景

久しぶりにFormオブジェクトを実装することになりました。いろいろ忘れてしまっていたので、実装に時間がかかってしまいました…次からスムーズにいくようここにまとめておきます。

実装方法

ファイルのパス

ファイルは今までの経験だと app/forms 配下に置くのが一般的となっています。autload_pathsに含まれていれば良いかなと思います。

autoload_pathsについてはこちらを参考にしてください。

必要なクラスのinclude

validationなどを実現するために、クラスをincludeします。
今回はActiveModel::Modelをincludeします。

こちらにあるように、ActiveModel::Modelをincludeすると以下のようなことができるようになります。

  • バリデーション
  • ハッシュでの初期化
  • form_forの利用

この3つはフォームを実装する上で必須の機能になります。

バリデーション

フォームで送信された値の妥当性をチェックするのに必要です。
valid?メソッドを呼び出すことによって、設定したバリデーションを呼び出すことができます。

ハッシュでの初期化

実装したフォームオブジェクトはコントローラで利用します。ハッシュで初期化できるということは、StrongParametersをそのまま渡すことができます。

こちらに記載の例を少し変更して

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class PeopleController < ActionController::Base
def new
@person = Person.new
end

def create
@person = Person.new(person_params)
if @person.valid?
@person.save
end
end

private
# 許可するパラメータはprivateメソッドでカプセル化します。
# これは非常によい手法であり、createとupdateの両方で使いまわすことで
# 同じ許可を与えることができます。また、許可する属性をユーザーごとにチェックするよう
# このメソッドを特殊化することもできます。
def person_params
params.require(:person).permit(:name, :age)
end
end

とすることができます。

form_forの利用

viewでフォームを作成する際はform_forを使うと便利です。上記の例を使うと

1
2
3
4
<% form_for @person, url: person_create_path do |f| %>
<%= f.text_field :name %>
<%= f.number_field :age %>
<% end %>

という感じになります。

ここまででほとんど実装できましたね。

翻訳

翻訳はactivemodelをキーにして定義します。

エラーメッセージなどは翻訳させないと項目名がそのまま表示されてしまいます。

まとめ

フォームオブジェクトの作り方をまとめました。ActiveModel::Modelモジュールがとても便利ということですね。

バリデーション、Strong Parameters、form_forを覚えておけばスムーズに実装できると思います。

余談ですが、利用規約の同意などでチェックボックスを使うことがあると思いますが、check_boxのバリデーションは acceptanceです。

validates :agreement, acceptance: { message: '利用規約に同意してください' }

という形式です。presenceではチェックしてなくてもバリデーション通ってしまいます…

※追記 こちらとてもよくまとまっています
https://thoughtbot.com/blog/activemodel-form-objects