将HAML添加到Rails资源管道中

13

我想提供已通过HAML预处理的客户端模板。我尝试使用haml_assets gem,并将以下代码添加到初始化程序中:

Rails.application.assets.register_engine ".haml", Tilt::HamlTemplate

这两种方法都会在我访问资源时提供原始的HAML,而不是编译后的HAML。如何将HAML添加到管道中?

6个回答

11

只是想澄清一下,因为我发现当前的答案有点令人恼火(虽然它们引导了我走向正确的方向)

如果我在一个初始化文件中添加这一行代码,它就可以工作:

# config/initializers/haml_assets.rb
Rails.application.assets.register_engine '.haml', Tilt::HamlTemplate
将你的 Haml 文件放入 assets 文件夹中,例如:
# app/assets/templates   

不要使用 haml_asset gem!


这在我的 Rails 3.2.13 上不起作用。编辑:也许它确实有效,我只需要更改模板以强制重新编译?对于user2470396的答案也需要相同的操作。 - Ibrahim
是的,在修改了文件后它起作用了,虽然在这之后我尝试了修改application.rb文件,但我随后撤销了其他答案的所有更改,现在它仍在运行。 - Ibrahim

10

在Rails 3.2中,下面的代码在我的应用程序中运行良好(包括预编译后的开发和生产环境):

require 'haml'

config.assets.paths << Rails.root.join("app", "assets", "templates")

class HamlTemplate < Tilt::HamlTemplate
  def prepare
    @options = @options.merge :format => :html5
    super
  end
end

config.before_initialize do |app|
  require 'sprockets'
  Sprockets::Engines #force autoloading
  Sprockets.register_engine '.haml', HamlTemplate
end

这样可以让你把模板放在“app/assets/templates”文件夹中,并以 .html.haml 后缀命名(需要包含 .html,否则在预编译过程中会生成 .htm 文件而不是 .html 文件)。


1
也对我有用(至少在开发中是这样)。一个注意点:如果您的HAML模板仍然呈现为原始的HAML,请进行小改动并重新加载。即使在开发环境中,Rails似乎也非常积极地缓存资源。 - Micah

5

这对我有效:

# app/assets/javascripts/test.html.haml

%p hello

# config/initializers/haml_template.rb

Rails.application.assets.register_mime_type 'text/html', '.html'
Rails.application.assets.register_engine '.haml', Tilt::HamlTemplate

这适用于http://127.0.0.1:3000/assets/test.html.haml

Rails.application.assets是一个Sprockets::Environment

API参考请参见此处:


这在我的开发环境中很好用,但是当我将其推到生产环境时,我仍然得到原始的HAML。我正在深入挖掘,但如果有人有线索,我将不胜感激。 - Michael Natkin
我的开发环境无法运行,你能帮我吗?如果我直接访问 .html.haml 或 .html 文件,它们都会作为字符串而不是 HTML 服务。 - felipeclopes

0

使用相同的方法,我得到了:

%tr
  %th
    %a.action.link.show
  %td
  %td

以纯Haml格式返回。但是

%tr
  %th
    %a.action.link.show
  %td cell 2
  %td cell 3

被作为HTML块提供。所以我认为这与haml gem有关。您可以使用以下内容强制进行haml转换:

%tr
  %th
    %a.action.link.show
  %td &nbsp
  %td &nbsp

希望能有所帮助...


0

在这里之前的两个答案需要合并才能得到完整的解决方案。

以下代码行在开发中有效:

# config/initializers/haml_assets.rb
Rails.application.assets.register_engine '.haml', Tilt::HamlTemplate

但是在任何预编译上都会失败。

为了让资产服务的Haml在预编译后工作,我们还需要在application.rb中添加这些行:

require 'haml'

config.assets.paths << Rails.root.join("app", "assets", "templates")

class HamlTemplate < Tilt::HamlTemplate
  def prepare
    @options = @options.merge :format => :html5
    super
  end
end

config.before_initialize do |app|
  require 'sprockets'
  Sprockets::Engines #force autoloading
  Sprockets.register_engine '.haml', HamlTemplate
end

0

使用齿轮3和4

# in /config/initializers/haml.rb
Rails.application.config.assets.configure do |env|
 env.register_mime_type "text/haml", extensions: %w(.haml .html.haml)
 env.register_transformer 'text/haml', Tilt::HamlTemplate.default_mime_type, Tilt::HamlTemplate
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接