備忘録。
状況
Userというモデルがあったとして、
index do
column(:name)
column(:address)
column(:status)
en
のようなとき、特定のカラムだけ色を変えるなどでクラスをつけたい場合、
column(:status, class: 'red')
とすると思う。
だめな例
この方法では、statusによって色を変えたいなどでクラスをつけたい場合に、
column(:status, class: status)
や
column(:status, class: user.status)
のように書くことはできない。ここの時点でUserのインスタンスを取得する手段がないため、
NoMethodErrorになってしまう。
では、どうするかというと、
column(:status) do |user|
current_arbre_element.add_class user.status
user.status
end
のようにしてあげるとできる
なんでそうなるのか
ActiveAdminのindex配下では、selfがActiveAdmin::Views::IndexAsTableというクラスのインスタンスになっている。
このクラスは、#current_arbre_elementというメソッドを持っていて、この戻り値で
Arbre(ActiveAdminの内で使っている、HTMLのヘルパーgem)か、ActiveAdmin::Views::配下の、HTMLオブジェクトを表しているクラスのインスタンスを返すようになっている。
このクラス達は、add_classなど、自分自身を編集するメソッドを持っているので、そこにクラスに設定したい値を渡してあげるという寸法。
おまけ
パネルとかだったら、以下のissueの下の方の方法でいける。
https://github.com/activeadmin/activeadmin/issues/1615
あとがき
ドキュメントを漁っても見つからず、自分でメソッドを漁る羽目になった。