Rails Active Admin封装column方法实现自定义列辅助函数
ActiveAdmin 表格列通用辅助方法实现
针对ActiveAdmin索引页表格列定义的重复代码问题,只需要把重复的块逻辑封装成自定义方法,内部调用原生column接口即可实现代码简化。
具体实现
1. 编写扩展代码
在config/initializers/目录下新建ActiveAdmin扩展文件,把通用列方法封装在独立模块中,避免污染全局作用域:
# config/initializers/active_admin_custom_columns.rb module ActiveAdmin module CustomTableColumns # 自定义列名的属性列 def rename_column(attribute_name, column_label) column column_label, &attribute_name.to_proc end # 附件图片列 def img_column(attribute_name) column attribute_name do |record| attachment_img(record.public_send(attribute_name)) end end # 长文本截断列,默认截断100字符,支持自定义截断长度 def truncate_column(attribute_name, truncate_length: 100) column attribute_name do |record| record.public_send(attribute_name).try(:truncate, truncate_length) end end end # 将辅助方法注入到表格构建上下文,保证index块内可直接调用 # 可排序表(reorderable_table)继承自普通表格索引,注入后可正常使用 Views::IndexAsTable::TableFor.include CustomTableColumns end
2. 生效验证
保存文件后重启Rails服务,原有重复的列定义就可以替换为简化写法,运行逻辑和原代码完全一致:
index as: :reorderable_table do column :position column :full_name rename_column :category_name, 'Category' img_column :avatar img_column :banner truncate_column :description truncate_column :short_profile actions end
补充说明
- 方法中使用
public_send读取模型属性,是为了避免意外调用模型私有方法,安全性更高 - 如果习惯把视图相关方法放在Helper目录,也可以把三个方法写在
app/helpers/active_admin_helper.rb中,只需要在对应ActiveAdmin资源配置块中添加controller { helper ActiveAdminHelper }引入即可 - 后续遇到其他重复列逻辑,比如状态标签列、时间格式化列,都可以用同样思路封装,无需重复编写
column do ... end块
内容的提问来源于stack exchange,提问作者Liren Yeo
相关产品推荐
相关产品推荐

