默认情况下使用Haml

49
有没有一种方法可以配置Rails默认使用Haml,例如在生成scaffold时会相应地生成`scaffold_name/index.html.haml`而不是`scaffold_name/index.html.erb`?
类似于如何添加`config.sass.preferred_syntax = :sass`到`config/application.rb`中并默认生成`scaffold_name.sass`。
尝试将以下内容添加到`config/application.rb`中。
config.generators do |g| 
  g.template_engine :haml
end

但最终得到了以下结果

$ rails generate scaffold foo name:string
  invoke  active_record
  create    db/migrate/20120208152550_create_foos.rb
  create    app/models/foo.rb
  invoke    test_unit
  create      test/unit/foo_test.rb
  create      test/fixtures/foos.yml
   route  resources :foos
  invoke  scaffold_controller
  create    app/controllers/foos_controller.rb
   error    haml [not found]
  invoke    test_unit
  create      test/functional/foos_controller_test.rb
  invoke    helper
  create      app/helpers/foos_helper.rb
  invoke      test_unit
  create        test/unit/helpers/foos_helper_test.rb
  invoke  assets
  invoke    coffee
  create      app/assets/javascripts/foos.js.coffee
  invoke    sass
  create      app/assets/stylesheets/foos.css.sass
  invoke  sass
  identical    app/assets/stylesheets/scaffolds.css.sass
$ rails destroy scaffold foo                                                                                                                        
  invoke  active_record
  remove    db/migrate/20120208152550_create_foos.rb
  remove    app/models/foo.rb
  invoke    test_unit
  remove      test/unit/foo_test.rb
  remove      test/fixtures/foos.yml
   route  resources :foos
  invoke  scaffold_controller
  remove    app/controllers/foos_controller.rb
   error    haml [not found]
  invoke    test_unit
  remove      test/functional/foos_controller_test.rb
  invoke    helper
  remove      app/helpers/foos_helper.rb
  invoke      test_unit
  remove        test/unit/helpers/foos_helper_test.rb
  invoke  assets
  invoke    coffee
  remove      app/assets/javascripts/foos.js.coffee
  invoke    sass
  remove      app/assets/stylesheets/foos.css.sass
  invoke  sass

我创建了一个很好的捆绑命令来替换所有erb文件为haml文件,遵循这个屏幕录像,但我仍然对如何在创建脚手架时将其设置为默认值感兴趣!我该如何做到让默认生成haml文件(而不是erb文件)?


这是Rails。欢迎加入。 - Green
6个回答

70
我在我的gemfile中使用gem 'haml-rails', '= 0.3.4'。它可以自动生成*.html.haml文件,无需任何配置。

9
对于新项目而言,通常不需要指定版本约束条件,除非你知道最新版本存在问题。 - Kelvin
1
Haml-rails 0.4版本是最后一个支持Rails 3的版本。 - johnnymire
https://dev59.com/R3bZa4cB1Zd3GeqPDDI4#37693041 - Nikhil Thombare

17

在您的应用程序配置中,尝试设置以下内容:

config.generators do |g|
  g.template_engine :haml
end

1
这给了我一个 error haml [not found],haml-rails 明确在 gem 文件中,我认为你是正确的方向,但是应该指定哪个适当的模板引擎来支持 haml 或者我该如何添加支持呢? - rudolph9
2
尝试将 'haml' gem 添加到您的 GemFile 中 gem 'haml', '~> 3.1.4' gem 'haml-rails', '0.3.4' - Aj Gu

8
如果您的Gemfile文件中有 gem 'haml-rails',它默认会创建Haml文件而不是Erb文件。

7

这很简单!

你只需要在Gemfile中添加以下内容:

gem 'haml'
gem 'haml-rails'

接着运行bundle install


1
发现这是完整的解决方案。
比如您有一个名为rails_address的Rails引擎项目。
将HAML配置添加到lib/rails_address/engine.rb中。
module RailsAddress
  class Engine < ::Rails::Engine
    isolate_namespace RailsAddress

    config.generators do |g| 
      g.template_engine :haml
    end
  end
end

rails_address.gemspec 中添加了 Haml 依赖项

...
  s.add_dependency "rails", "~> 4.1.10"
  s.add_dependency 'haml', '~> 4.0.6'
  s.add_dependency 'haml-rails', '~> 0.9.0'
...

最后,在 lib/rails_address.rb 中需要引入 Haml 宝石。
require "rails_address/engine"
require "haml"
require "haml-rails"

module RailsAddress
end

如果您尚未安装Haml宝石,请执行bundle install

现在,当您通过脚手架或控制器生成时,将创建Haml视图。

例如:

$ rails g scaffold Address street:string city:string state:string zip_code:string
...
invoke    haml
exist      app/views/rails_address/addresses
create      app/views/rails_address/addresses/index.html.haml
create      app/views/rails_address/addresses/edit.html.haml
create      app/views/rails_address/addresses/show.html.haml
create      app/views/rails_address/addresses/new.html.haml
create      app/views/rails_address/addresses/_form.html.haml
...

太好了,谢谢,这解决了我的问题。不过,我认为值得一提的是,对于我来说,在rails_address.gemspec文件中指定s.add_dependency 'haml'和在lib/rails_address/engine.rb文件中指定g.template_engine :haml就足以生成haml视图。(使用rails 5.1.4) - Misu

0

haml [not found] 错误通常是因为捆绑包不完整。您尝试过运行 bundle update 然后重新运行生成器吗?


问题仍然存在。尝试了 bundle update,问题仍然存在。删除了 Gemfile.lock 并调用了 bundle install,问题仍然存在。 - rudolph9

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