如何将含Ruby变量的动态HTML代码与独立HTML文件关联?
嘿,这个需求太常见啦!Ruby生态里有现成的方案帮你把HTML结构和动态逻辑彻底分开,最顺手的就是用内置的ERB模板引擎,给你详细说说怎么搞:
方案一:用Ruby内置的ERB模板(最推荐)
ERB是Ruby自带的模板工具,不用额外装依赖,完美适配你说的「变量嵌入+未知次数循环」场景。
1. 抽离HTML到ERB模板文件
新建一个test.html.erb文件,把原来的HTML结构放进去,在需要动态内容的地方嵌入Ruby代码:
<!DOCTYPE html> <html> <head> <title><%= page_title %></title> </head> <body> <h1>动态内容展示</h1> <!-- 循环渲染列表(未知次数完全没问题) --> <div class="item-list"> <% dynamic_items.each do |item| %> <div class="item-card"> <h3><%= item[:title] %></h3> <p><%= item[:content] %></p> </div> <% end %> </div> <!-- 嵌入单个Ruby变量 --> <p>当前时间:<%= current_time %></p> </body> </html>
这里的语法规则很简单:
<%= 变量/表达式 %>:把Ruby代码的执行结果输出到HTML里<% Ruby代码 %>:执行Ruby逻辑(比如循环、条件判断),但不会输出内容
2. 在test.rb里渲染模板并传入数据
编写Ruby代码读取模板,准备好动态数据,然后生成最终的HTML:
require 'erb' # 1. 准备需要传入模板的动态数据 page_title = "我的动态页面" current_time = Time.now.strftime("%Y-%m-%d %H:%M") dynamic_items = [ { title: "第一条动态", content: "这是ERB渲染的内容" }, { title: "第二条动态", content: "循环次数完全由数据决定" }, # 可以根据业务逻辑动态添加更多元素 ] # 2. 读取ERB模板文件 template_content = File.read('test.html.erb') erb_template = ERB.new(template_content) # 3. 渲染模板:binding会把当前作用域的所有变量传递给模板 rendered_html = erb_template.result(binding) # 4. 输出或保存结果:可以直接打印,也可以写入文件 puts rendered_html File.write('final_output.html', rendered_html)
额外:如果是Web框架场景(Rails/Sinatra)
要是你的代码是在Web框架里跑的,那就更省心了:
- Rails里:把模板放在
app/views目录,控制器里定义实例变量(比如@dynamic_items),直接用render方法就能自动关联渲染 - Sinatra里:把
.erb模板放在views文件夹,路由里定义变量后调用erb :test即可完成渲染
方案二:可选的其他模板引擎
如果觉得ERB的语法不够简洁,也可以用更轻量的模板引擎:
- Slim:用缩进代替HTML标签,代码更紧凑
- Haml:和Slim类似,也是缩进式语法,可读性强
比如用Slim写的模板会是这样:
html head title = page_title body h1 动态内容展示 .item-list - dynamic_items.each do |item| .item-card h3 = item[:title] p = item[:content] p 当前时间:= current_time
使用前需要先安装对应gem(比如gem install slim),然后在Ruby代码里替换成对应引擎的渲染逻辑即可。
内容的提问来源于stack exchange,提问作者Finfa811
相关产品推荐
相关产品推荐

