Rails资产管道Rails.application.assets.instance_variable_get('@ environment')返回nil

时间:2013-06-27 21:47:38

标签: ruby-on-rails asset-pipeline assets

我正在尝试动态编译javascript,然后将其添加到sprockets存储中,以便它可用。我研究过的每个地方都建议使用以下代码来注册javascript:

env = Rails.application.assets.is_a?(Sprockets::Index) ? Rails.application.assets.instance_variable_get('@environment') : Rails.application

Rails.application.config.assets.digests[file_name] = env[file_name].digest_path

在制作中,Rails.application.assets.instance_variable_get('@environment')总是返回nil,有什么我做错了吗?或者我应该添加别的东西?

2 个答案:

答案 0 :(得分:5)

Rails.application.assets本身是Sprockets :: Environment的一个实例  @environment'是assets_manifest的变量,属于Rails.application,如下所示:

Rails.application.instance_variable_get('@assets_manifest').instance_variable_get('@environment')

我在RAILS 3.2.15中遇到了类似的问题, 但它是Rails.application.assets返回nil quiet_assets.rb:4:in':未定义的方法logger=' for nil:NilClass (NoMethodError)

发行的是 Rails.application.assets.logger = Logger.new('logger.log')

我回到Rails控制台,发现Rails.application.assets刚刚返回nil。

我通过这一步解决了这个问题:

  1. 在您的Gemfile中包含两个gem,以防您没有它。 宝石'链轮' gem'sprockets-rails'

  2. 找到导致问题的文件,并初始化您的资产对象。 你也可以把它放在application.rb中,在我的情况下,我把它放在config / initializers / quiet_assets.rb中,然后再引用logger。

    添加以下行:

    Rails.application.assets = Sprockets::Environment.new

    在此发布行之前:

    Rails.application.assets.logger = Logger.new('logger.log')

  3. 在application.rb中
  4. ,记得要激活资产管道。 config.assets.enabled = true

  5. 用于制作,您可能需要设置config.assets.compile = true

  6. 希望这有所帮助

答案 1 :(得分:0)

自己构建(新版本需要)

env = Sprockets::Railtie.build_environment(Rails.application)