becomes と 単一継承テーブル
単一継承テーブルしてる複数のモデルで、同一のformを使うとするとActiveRecord::Persistence#becomesメソッドを使うと思う。
このbecomesメソッドはコントローラーで使ったほうがいいよという話。
今までの自分はform_forメソッドの引数へ直接becomesを書いていた。
これだと、controllerでbuild_hogeを実行し、インスタンスが関連付いたのに、becomesによってSpotクラスのインスタンスになると、hogeへの参照がなくなってしまう。
<%= form_for([:admin, @spot.becomes(Spot)]) do |f| %> ...
そのため、nested_attributeの関連にこっそりnilが入っているので、入力項目が表示されなかったことが起きた。
永続化する前なので当たり前っぽい。
[2] pry(main)> spot = Spot.new => #<Spot id: nil, title: nil, traffic_route: nil> [3] pry(main)> spot.metadata => nil [4] pry(main)> spot.build_metadata => #<Metadata id: nil, title: nil, description: nil, created_at: nil, updated_at: nil, keywords: nil, metadatable_type: "Spot", metadatable_id: nil> [5] pry(main)> spot.metadata => #<Metadata id: nil, title: nil, description: nil, created_at: nil, updated_at: nil, keywords: nil, metadatable_type: "Spot", metadatable_id: nil> [6] pry(main)> spot = spot.becomes(Spot) => #<Spot id: nil, title: nil, traffic_route: nil> [7] pry(main)> spot.metadata => nil