能否在同一HAML文件内定义并调用自定义函数?(Middleman环境)
在Middleman的HAML文件中内联定义页面专用函数的解决方法
你遇到的undefined method 'foo'错误,是因为直接用-def定义的方法作用域不对——这种方式定义的方法只存在于当前的局部代码块中,后续模板渲染时无法访问到。
解决这个问题有两种常用方式,都不需要把方法放到全局助手文件里:
方法一:使用helpers do包裹方法定义
用helpers do块把方法定义包裹起来,这样方法会被注册到模板的助手上下文,整个页面都能调用:
- helpers do def foo(color, text) content_tag :p, style: "color: #{color}" do text end end %html %head %title Demo page %body %h1 demo page =foo("red", "this is red") =foo("blue", "this is blue")
方法二:用Lambda/Proc定义局部函数
如果逻辑比较简单,也可以把函数存为局部lambda变量,调用时用call方法:
- foo = lambda { |color, text| content_tag(:p, style: "color: #{color}") { text } } %html %head %title Demo page %body %h1 demo page =foo.call("red", "this is red") =foo.call("blue", "this is blue")
两种方式都能实现页面内专用函数的需求,其中第一种方式的语法更接近常规助手方法,使用起来更顺手。
内容的提问来源于stack exchange,提问作者Grant Birchmeier
相关产品推荐
相关产品推荐

