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

Slim模板缩进导致作用域迭代变量domains无法访问的问题

问题原因与解决方案

核心问题

你遇到的undefined local variable or method 'domains'错误,本质是Slim的标签解析规则和缩进作用域匹配错误导致的,具体有两个关键点:

  1. 标签文本解析错误
    你的h4 for host: #{host} #{domains}写法不符合Slim语法:Slim会把标签后紧跟的for识别为HTML的for属性(用于关联表单元素),而非文本内容的一部分。这会导致该行的Ruby插值#{host}和#{domains}被错误解析到属性上下文里,直接打乱了后续代码的作用域判断。

  2. 缩进与代码块作用域失配
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 03:18:41