activeadmin
rails,

ActiveAdminでPOSTパラメータを加工してUpdateするメモ

問題

  • ActiveAdminで簡単に管理画面を作りたい
  • PostgreSQL特有のデータ型はがないので自作する必要がある
    • 本当はformをいじるなりしてデータ作成出来るようにするほうが良いと思われる
  • Formtastic::Inputs(および付随するjs/css)を書く手間をかけたくない
    • そうだActiveAdmin側のcontrollerを変更しよう

注意点とか?

  • ActiveAdmin.register Post do ... endとするとAdmin::PostContollerが定義されている
    • その中でcontollerを定義すればオーバーライドできる
  • resource_paramsはArrayにActionController::Parametersが入っていた
    • 未確認:複数インスタンスを扱うため?

サンプルコード

app/admin/post.rb
ActiveAdmin.register Post do 
  permit_params :uid, :name, :meta, :related_ids

  form do |f|
    f.semantic_errors # shows errors on :base
    f.inputs do
      f.input :uid
      f.input :name
      f.input :meta,         as: :text    # json,jsonb型をtextとして扱う
      f.input :related_uids, as: :string  # arrayをstringとして扱う
    end
    f.actions
  end # form

  controller do
    # 既メソッドを利用してパラメータを加工する
    # https://github.com/activeadmin/inherited_resources/blob/46493ce10fc7d9f0bcd753f5d298c67ca83cf9b0/lib/inherited_resources/base_helpers.rb#L316
    # https://github.com/activeadmin/inherited_resources/blob/46493ce10fc7d9f0bcd753f5d298c67ca83cf9b0/lib/inherited_resources/base_helpers.rb#L356
    def nomralized_params
      resource_params.map{ |p|
        p.merge(
          related_uids: p[:related_uids].split.map{&:to_i}
        )
      }
    end

    # メソッドをオーバーライドする
    # https://github.com/activeadmin/inherited_resources/blob/46493ce10fc7d9f0bcd753f5d298c67ca83cf9b0/lib/inherited_resources/actions.rb#L42
    def update(options={}, &block)
      object = resource
      if update_resource(object, nomralized_params)
        options[:location] ||= smart_resource_url
      end

      respond_with_dual_blocks(object, options, &block)
    end
  end

end