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

使用Ruby的yield实现HTML标签包裹 代码输出异常问题求解

问题根因
  • 直接将数组类型的attributes参数拼接进HTML字符串时,Ruby会自动调用数组的to_s方法,输出数组的字面量格式["class=", "red"],就是你看到的异常属性部分。
  • 用数组存储HTML属性的结构不合理,无法直接映射为HTML标准的属性名="属性值"格式,改用哈希存储属性语义更清晰,也更易解析。
修复实现

修改属性拼接逻辑,传入哈希格式的属性参数,修复后的代码如下:

def tag(tag_name, attributes = nil)
  # 拼接属性字符串
  attr_part = if attributes
                attributes.map { |key, val| " #{key}=\"#{val}\"" }.join
              end
  "<#{tag_name}#{attr_part}>#{yield}</#{tag_name}>"
end

# 调用时用哈希传递属性
style_tag = tag("div", { class: "red" }) do
  tag("h1") do
    "Google it"
  end
end

运行后输出结果为:

<div class="red"><h1>Google it</h1></div>

完全符合HTML格式要求。

补充说明

如果需要兼容多属性场景,比如同时传class、id等,直接在哈希里加键值对即可:

tag("div", { class: "red", id: "main-container", "data-id": "123" }) do
  "内容"
end

如果要处理属性值中的特殊字符(比如双引号、尖括号),可以引入CGI.escapeHTML对属性值做转义,避免生成非法HTML或者XSS风险。

内容的提问来源于stack exchange,提问作者Onur Karadeniz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:27:01