ActiveAdminでhas_oneのassociationに対するnestしたフォームを作る


has_oneのネストしたフォームをActiveAdminで書いたことがなく、ハマったのでメモ代わりに書きます。

Rails 4以降であれば、以下のように書けます。

親モデルParent、子モデルChildが以下のように定義されているときに、

class Parent < ActiveRecord::Base
  has_one :child
end

class Child < ActiveRecord::Base
  belongs_to :parent
end

ActiveAdminのParentモデルのフォームでは、ヘルパーの:forを使って、以下のように駆ける。(permitなどの記載は省略)

/admin/models/parent.rb
ActiveAdmin.register Parent do
  form do |f|
    f.inputs "子モデルの編集", :for => [:child, f.object.child || Child.new] do |child|
      child.input :hoge
    end
  end

end

:for のところでは、既存のオブジェクトで、すでにchildモデルが設定されていればそれを使い、なければ、Childモデルをnewする、というように書いておく。これで、新規作成時は新しいChildモデルが作られ、更新時は既存のものが使われる。