我想提供已通过HAML预处理的客户端模板。我尝试使用haml_assets gem,并将以下代码添加到初始化程序中:
Rails.application.assets.register_engine ".haml", Tilt::HamlTemplate
这两种方法都会在我访问资源时提供原始的HAML,而不是编译后的HAML。如何将HAML添加到管道中?
我想提供已通过HAML预处理的客户端模板。我尝试使用haml_assets gem,并将以下代码添加到初始化程序中:
Rails.application.assets.register_engine ".haml", Tilt::HamlTemplate
这两种方法都会在我访问资源时提供原始的HAML,而不是编译后的HAML。如何将HAML添加到管道中?
只是想澄清一下,因为我发现当前的答案有点令人恼火(虽然它们引导了我走向正确的方向)
如果我在一个初始化文件中添加这一行代码,它就可以工作:
# config/initializers/haml_assets.rb
Rails.application.assets.register_engine '.haml', Tilt::HamlTemplate
将你的 Haml 文件放入 assets 文件夹中,例如:# app/assets/templates
不要使用 haml_asset gem!
在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 文件)。
这对我有效:
# 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参考请参见此处:
使用相同的方法,我得到了:
%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  
%td  
希望能有所帮助...
在这里之前的两个答案需要合并才能得到完整的解决方案。
以下代码行在开发中有效:
# 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
使用齿轮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