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

use*_*640 4 assets ruby-on-rails asset-pipeline

我试图动态编译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
Run Code Online (Sandbox Code Playgroud)

在生产中,Rails.application.assets.instance_variable_get('@environment')总是返回零,有什么我做错了吗?或者我应该添加其他东西?

twi*_*dai 6

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':undefined方法logger=' for nil:NilClass (NoMethodError)

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

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

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

  1. 在你的Gemfile中包含两个gem,以防你没有它.宝石'链轮'宝石'链轮 - 导轨'

  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中,记得要激活资产管道. config.assets.enabled = true

  4. 对于生产,您可能需要设置config.assets.compile = true

希望这会有所帮助