はじめに
ActiveRecordを使ってフォーム画面を実装する際は、モデルに対応するDBテーブルが必要になりますが、データの永続化が不必要で対応するDBテーブルがない場合でもフォーム実装を行いたい時には、ActiveRecordではなく、ActiveModelを用います。ただ、ActiveModelでform_forを使おうとした場合にエラーでハマったので、そこの対処法をまとめます。
環境
- Rails: 4.2.6
- ruby: 2.3.0
エラーメッセージ
ActionView::Template::Error (undefined method `to_key' for #<Simulator:0x007fc4d96bfd00>
Did you mean? to_query):
-
to_key
メソッドがないと言われ、エラーになります。
対処法
対応前
class Hoge
include ActiveModel::Model
# フォームで利用する値の定義
attr_accessor :hoge, :fuga, :foo, :bar
# バリデーションの定義
validates :hoge, presence: true, length: { maximum: 50 }
validates :fuga, presence: true
validates :foo, presence: true
validates :bar, presence: true
- モデルで
ActiveModel::Model
をインクルードし、ActiveModelを利用できるようにしています。
対応後
class Hoge
include ActiveModel::Model
include ActiveModel::Conversion
# フォームで利用する値の定義
attr_accessor :hoge, :fuga, :foo, :bar
# バリデーションの定義
validates :hoge, presence: true, length: { maximum: 50 }
validates :fuga, presence: true
validates :foo, presence: true
validates :bar, presence: true
def persisted? ; false ; end
-
ActiveModel::Conversion
をインクルードし、persisted?
メソッドを定義します。 - 上記をクラス内に記述することで、Railsの変換メソッド(さっきエラーになった
to_key
メソッド)をそのクラスのオブジェクトに対して呼び出すことができるようになるそうです。