【问题标题】:Rails asset pipeline not working in production environment?Rails 资产管道在生产环境中不起作用?
【发布时间】:2011-10-03 22:51:55
【问题描述】:

我最近将一个应用从 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(减去一些 cmets)

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 目录中。

【问题讨论】:

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


    【解决方案1】:

    Sprockets 未加载。

    为了删除以前版本的 rails 中的活动记录(这个问题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 被注释掉了。我不知道链轮有自己的导轨。非常感谢你。
    【解决方案2】:

    Upgrading to 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手动加载文件

    文件应该加载,如果没有尝试检查权限和进一步的日志。

    【讨论】:

    • 谢谢,我在进行更改时观察了导轨的投射。我已更新我的答案以解决您的建议。
    • 你能发布你的application.rbproduction.rb吗?
    • 我已将完整的application.rbproduction.rb 添加到问题中。完整回购:github.com/trevorpower/trevorpower-com
    最近更新 更多