Slim模板缩进导致作用域迭代变量domains无法访问的问题
问题原因与解决方案
核心问题
你遇到的undefined local variable or method 'domains'错误,本质是Slim的标签解析规则和缩进作用域匹配错误导致的,具体有两个关键点:
标签文本解析错误
你的h4 for host: #{host} #{domains}写法不符合Slim语法:Slim会把标签后紧跟的for识别为HTML的for属性(用于关联表单元素),而非文本内容的一部分。这会导致该行的Ruby插值#{host}和#{domains}被错误解析到属性上下文里,直接打乱了后续代码的作用域判断。缩进与代码块作用域失配
Slim完全依靠缩进界定Ruby代码块(比如each循环)的作用范围。前面的标签解析错误会让Slim误判外层@host_domains.each循环的结束位置,导致内层domains.each代码跳出了外层循环的作用域,自然找不到domains变量。
同时你的代码里还有两个小错误:
.panel.body应该是.panel-body(Bootstrap面板的正确类名).col-lg3应该是.col-lg-3(Bootstrap栅格类的正确格式)
修正后的Slim代码
.row .col-md-12.col-lg-3 .col-md-6.col-lg-3 .panel.panel-default.list-panel .panel-heading h3.panel-title Some Title .panel-body ul - @host_domains.each do |host, domains| li h4= "for host: #{host} #{domains}" ul - domains.each do |domain| li = domain
关键修正点说明
h4= "for host: #{host} #{domains}":用=明确告诉Slim这是要执行的Ruby表达式,输出完整文本内容,避免把for解析为HTML属性。- 统一缩进层级:确保所有属于外层
each循环的内容(包括内层ul和domains.each)都保持在比- @host_domains.each更深的缩进级别,让Slim正确识别代码块的作用域。 - 修正Bootstrap类名:避免生成不符合预期的DOM结构。
内容的提问来源于stack exchange,提问作者Thermatix
相关产品推荐
相关产品推荐

