生产环境下的Rails资产管道不起作用?

7

最近我将一个 Rails 3.0 的应用升级到了 3.1 版本。我按照能够找到的任何指示来启用资源管道,但在生产环境中它总是失败:

<%= javascript_include_tag "application" %>

给我
<script src="/javascripts/application.js" type="text/javascript"></script>

该文件缺少摘要,因此我遇到了以下错误:

cache: [GET /javascripts/application.js] miss
Started GET "/javascripts/application.js" for 127.0.0.1 at 2011-10-03 23:31:36 +0100
ActionController::RoutingError (No route matches [GET] "/javascripts/application.js"):

我尝试了在application.rb中这些设置的不同变化:

require File.expand_path('../boot', __FILE__)

#require 'rails/all'
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "rails/test_unit/railtie"

if defined?(Bundler)
  # If you precompile assets before deploying to production, use this line
  Bundler.require *Rails.groups(:assets => %w(development test))
  # If you want your assets lazily compiled in production, use this line
  # Bundler.require(:default, :assets, Rails.env)
end


module Blog
  class Application < Rails::Application
    config.autoload_paths += %W(#{config.root}/lib)
    config.encoding = "utf-8"
    config.filter_parameters += [:password]
    config.assets.enabled = true
    config.assets.version = '1.0'
  end
end

以及完整的production.rb文件(去除一些注释)

Blog::Application.configure do
  config.cache_classes = true
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true
  config.serve_static_assets = false
  config.assets.compress = true
  config.assets.compile = false
  config.assets.digest = true
  config.i18n.fallbacks = true
  config.active_support.deprecation = :notify
end

我已经运行了rake assets:precompile任务。

我是否遗漏了任何明显的步骤?

编辑:一些额外的细节:

我的资产位于app/assets文件夹中。app/assets/imagesapp/assets/javascriptsapp/assets/stylesheets等。

我在我的public/assets目录中看到生成的文件名和摘要。

app/assets/javascripts/application.js确实编译成像public/assets/application-6ec417a53cb2bdb949966a153a61e7b1.js这样的东西。它们最终会出现在public目录中。

2个回答

12

Sprockets没有被加载。

为了在之前的Rails版本中删除Active Record(比如这个问题Remove ActiveRecord in Rails 3 (beta)),require 'rails/all'被替换为

require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "rails/test_unit/railtie"

这里缺失的是 sprockets/railtie


我一直在使用RSpec,因此有着类似的测试单元设置,只是test_unit被注释掉了。我完全不知道sprockets有它自己的railtie。非常感谢你的指点。 - Olivier Lacan

3
请参见升级到Rails 3.1 Railscast视频。
确保你的资源文件在app/assets文件夹中,例如:app/assets/imagesapp/assets/javascriptsapp/assets/stylesheets等。
执行rake assets:precompile命令。
如果启用了摘要信息,在app/public/assets目录中会生成带有名称和摘要信息的文件。
例如:app/assets/javascripts/application.js会被编译为/assets/application-6ec417a53cb2bdb949966a153a61e7b1.js
如果资源文件名带有摘要信息,你需要在production.rb中添加以下配置:
# Generate digests for assets URLs
config.assets.digest = true

如果您查看网页源代码,应该会看到类似于以下内容:
<script src="/assets/application-6ec417a53cb2bdb949966a153a61e7b1.js" type="text/javascript"></script>

尝试手动加载文件,访问http://example.com//assets/application-6ec417a53cb2bdb949966a153a61e7b1.js

如果文件没有加载,请检查权限和日志。


谢谢,我在做更改时已经看过了Rails Cast。我已经更新了我的答案以解决您的建议。 - tpower
你可以发一下你的 application.rbproduction.rb 文件吗? - Joey
我已经将完整的 application.rbproduction.rb 添加到问题中。完整的存储库:https://github.com/trevorpower/trevorpower-com - tpower

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接