如何在Rails Admin中用pretty_value和bindings[:view].tag实现自定义格式化输出
Rails Admin Show Page: Custom Formatted Value with Line Breaks and JSONB Pretty Print
以下是满足需求的实现代码,结合bindings[:view].tag和JSON格式化解决问题:
register_instance_option :formatted_value do elements = data_modules.flat_map do |dm| dm_value = value[dm.name].presence || {} dm.fields.map do |field| dm_field_value = dm_value[field.name].presence || '' # 处理JSONB类型值的美化输出 if dm_field_value.is_a?(Hash) || dm_field_value.is_a?(Array) formatted_json = JSON.pretty_generate(dm_field_value) field_value = bindings[:view].tag.pre(formatted_json, class: 'json-preformatted') else field_value = dm_field_value end # 用div包裹每个字段项,实现自动换行 bindings[:view].tag.div do "#{field.label}: #{field_value}".html_safe end end end elements.join.html_safe end
关键实现说明:
- 换行显示:使用
bindings[:view].tag.div创建块级元素包裹每个字段项,div在HTML中默认独占一行,彻底解决换行问题,比手动加换行符或逗号更可靠。 - JSONB美化:判断字段值是否为Hash/Array(Rails从JSONB字段读取的默认类型),用
JSON.pretty_generate生成带缩进的格式化JSON字符串,再用tag.pre包裹,保留格式的同时避免换行被压缩。可以通过class: 'json-preformatted'自定义样式(比如调整字体、缩进)。 - HTML安全渲染:最后调用
html_safe确保生成的HTML标签不会被Rails转义,Rails Admin会正确解析渲染这些元素。
为什么之前的尝试没生效?
- 直接用换行符
\n:HTML会忽略纯文本换行,必须用块级元素或<br>标签才能生效。 - 生成
<p>标签数组未加html_safe:Rails会自动转义HTML标签,导致标签以文本形式显示。 - 渲染局部模板:局部模板的上下文无法直接获取当前字段配置中的
data_modules变量,因此直接在formatted_value方法内处理更高效。
内容的提问来源于stack exchange,提问作者Maksym Furgalo
相关产品推荐
相关产品推荐

