我有一个基于 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