4

我正在尝试动态编译 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')总是返回零,我做错了什么吗?还是我应该添加其他东西?

4

2 回答 2

7

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 methodlogger=' 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

希望这会有所帮助

于 2015-06-10T00:13:18.170 回答
0

自己构建(新版本需要)

env = Sprockets::Railtie.build_environment(Rails.application)
于 2017-05-13T06:22:45.347 回答