【问题标题】:Rails asset pipeline Rails.application.assets.instance_variable_get('@environment') returns nilRails 资产管道 Rails.application.assets.instance_variable_get('@environment') 返回 nil
【发布时间】:2013-06-27 21:47:38
【问题描述】:

我正在尝试动态编译 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,我做错了什么吗?还是我应该添加其他内容?

【问题讨论】:

  • 有人可以回答吗?

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


【解决方案1】:

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 中,记得激活 assets pipeline 。 config.assets.enabled = true

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

希望这能有所帮助

【讨论】:

  • 天才!
【解决方案2】:

自己构建(新版本需要)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多