You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:10:34