2

我在前端有一个带有 Ember 的 Rails 应用程序。今天,我升级到 Rails 4,唯一无法解决的问题是我的 Handlebars 模板没有被编译或包含为资产(在开发模式下)。我没有收到任何错误消息。

我生成了一个全新的 Rails 4 测试应用程序并安装了 Ember,它可以很好地处理 Handlebars 文件。测试应用程序中的所有宝石都存在于我的应用程序中。我尝试运行rake rails:upgrade,但没有效果。我尝试修改 ember-rails 源以输出日志消息,并且测试应用程序和我的应用程序的消息和执行路径相同。

我像往常一样需要模板:

require_tree ./templates

我尝试使用 ember-rails 0.11.1 和 Github master,但没有成功。

相关宝石版本:

  * ember-data-source (0.0.5)
  * ember-rails (0.11.1 4dc902b)
  * ember-source (1.0.0.rc2.0)
  * sprockets (2.9.0)
  * sprockets-rails (2.0.0.rc3)
  * barber (0.4.1)
  • 模板都在 app/assets/javascripts/templates 中,并且都使用扩展名 .handlebars。虽然我也尝试过 .hbs 和 .js.hjs 。

从 Chrome 控制台:

Ember.TEMPLATES 对象 {}

我可以像这样从 Rails 命令行手动编译资产:

environment = Sprockets::Environment.new
environment.append_path 'app/assets/javascripts'
a = environment['templates/test.handlebars']
a.to_s => "..compiled template.."

并且引擎已注册:

environment.engines
=> {..".handlebars"=>Ember::Handlebars::Template..}

Rails.application.config.assets.paths 应该包含 app/assets/javascripts 文件夹。

对此的任何帮助将不胜感激,谢谢!

4

1 回答 1

4

我已将其缩小到 ember-rail 的 engine.rb 文件中的以下块。对于我的应用程序,它在 Sprockets 上发送 register_engine,而不是 app.assets。在新的 Rails 4 测试应用程序上,它也是这样做的。但是,在我的应用程序中,当我强制执行使用 app.assets 时,会编译车把模板。

我相信由于我的应用程序是从 Rails 3 升级的,因此缺少一些配置以正确使用 Sprockets。当我知道时,我会发布更多。

 initializer "ember_rails.setup", :after => :append_assets_path, :group => :all do |app|
    sprockets = if ::Rails::VERSION::MAJOR == 4
      Sprockets.respond_to?('register_engine') ? Sprockets : app.assets
    else
      app.assets
    end

    sprockets.register_engine '.handlebars', Ember::Handlebars::Template
    sprockets.register_engine '.hbs', Ember::Handlebars::Template
    sprockets.register_engine '.hjs', Ember::Handlebars::Template
  end

更新:对我来说,更改 application.rb 中的 railties 顺序足以解决问题。我相信其他一些引擎正在清除 Sprockets 配置,因此通过在此过程后期加载 Ember::Rails 引擎,我能够解决该问题。

config.railties_order = [:main_app, :all, Ember::Rails::Engine]
于 2013-04-04T03:54:53.707 回答