首页 > 编程问答 >在同一 HAML 文件中定义和使用函数

在同一 HAML 文件中定义和使用函数

时间:2024-07-20 14:07:17浏览次数:7  
标签:ruby-on-rails haml middleman

我有一个基于 haml 的轻量级网站,正在使用 Middleman 构建(不是 Rails,但我用 Rails 标记它,因为我认为 Rails 的人可能知道答案)。

是否可以定义haml 文件中的内联函数,然后在同一文件中使用它?

(是的,我知道如何使用单独定义的帮助程序文件。这不是问题。)

我有一个页面专门针对该页面的函数。 在帮助程序文件中定义它对我来说是不必要的分离。

示例:

-def foo(color,text)
  -content_tag :p, style: "color: #{color}" do
    -text

%html
  %head
    %title Demo page

  %body
    %h1 demo page

    =foo("red", "this is red")
    =foo("blue", "this is blue")

渲染上面的页面结果 undefined method 'foo'

有没有办法让它工作? (我是否错误地定义了函数?)


很不幸,你不能直接在 Haml 模板中定义和使用函数,就像你在示例中尝试的那样。Haml 主要是为了模板化而设计的,它依赖于预定义的帮助函数和变量来渲染内容。

不过,你可以使用一些替代方法来实现类似的功能:

1. 使用帮助函数文件:

这是最常见和推荐的方法。虽然你说你不想使用单独的文件,但这通常是最干净和可维护的解决方案。

  • helpers 目录下创建一个文件,例如 my_helpers.rb
  • 定义你的函数:
module MyHelpers
  def foo(color, text)
    content_tag :p, style: "color: #{color}" do
      text
    end
  end
end
  • 在你的 config.rb 文件中引入帮助函数:
helpers MyHelpers
  • 现在你可以在你的 Haml 模板中使用 foo 函数了。

2. 使用 lambda 表达式:

你可以在 Haml 模板中定义一个 lambda 表达式,然后在同一个模板中调用它。

- foo = lambda { |color, text| content_tag :p, text, style: "color: #{color}" }
%h1 demo page
= foo.call("red", "this is red")
= foo.call("blue", "this is blue")

这个方法将函数定义在模板的范围内,避免了创建单独的文件。但是,如果逻辑过于复杂,可能会降低代码的可读性。

3. 使用局部变量和代码块:

你可以使用局部变量和代码块来封装逻辑,并在需要的地方调用它。

- my_paragraph = { |color, text| content_tag :p, text, style: "color: #{color}" }
%h1 demo page
= my_paragraph.call("red", "this is red")
= my_paragraph.call("blue", "this is blue")

这种方法类似于 lambda 表达式,但在某些情况下可能更易读。

最终,选择哪种方法取决于你的具体需求和偏好。如果函数逻辑简单且只在单个模板中使用,lambda 表达式或局部变量方法可能是合适的。但是,如果函数逻辑复杂或者需要在多个模板中使用,最好使用帮助函数文件来保持代码的整洁和可维护性。

标签:ruby-on-rails,haml,middleman
From: 78760845

相关文章

  • 【机器学习|数学基础】Mathematics for Machine Learning系列之矩阵理论(13):Hamliton-Cay
    目录前言Hello!小伙伴!非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ 自我介绍ଘ(੭ˊᵕˋ)੭昵称:海轰标签:程序猿|C++选手|学生简介:因C语言结识编程,随后转入计算机专业,有幸拿过一些国奖、省奖…已保研。目前正在学习C++/Linux/Python学习经验:扎实基础+多做笔记+......
  • Hamlet 词频统计
    1defgetText():2txt=open('I:\Hamlet_-Prince-of-Denmark_哈姆雷特_.txt','r').read()3txt=txt.lower()4forchin'!"#$%&()*+,-./:;<=>?@[......
  • regexcrossword Hamlet篇
    一个练习正则表达式的网站,用类似数独的方式填写,但是规则是正则。从简单到难循序渐进,网址:https://regexcrossword.com偶尔访问不了基本的话,DoubleCross篇之前的做一遍,正......
  • 转载:HTML代码简写法:Emmet和Haml
    HTML代码简写法:Emmet和Haml作者: 阮一峰日期: 2013年6月11日HTML代码写起来很费事,因为它的标签多。一种解决方法是采用模板,在别人写好的骨架内,填入自己的内容。还......