問題
- 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