我在前端有一个带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)
从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包含应用程序/ assets / javascripts文件夹。
非常感谢任何帮助,谢谢!
答案 0 :(得分: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]