Rails忽略S3中的预编译资产,“无法找到文件'bootstrap'”

时间:2013-05-06 18:21:19

标签: ruby-on-rails amazon-s3 asset-pipeline

我在本地预编译资产并将它们推送到S3。在制作中我得到了这个错误:

heroku[router]: at=info method=GET path=/ host=www.someapp.org fwd="76.87.106.226" dyno=web.1 connect=2ms service=614ms status=500 bytes=0
app[web.1]: ActionView::Template::Error (couldn't find file 'bootstrap'
app[web.1]:   app/views/application/_stylesheets.html.erb:1:in `...'
app[web.1]:   app/views/layouts/application.html.erb:5:in `...'
app[web.1]:
app[web.1]:   (in /app/app/assets/stylesheets/application.css:11)):
app[web.1]:     1: <%= stylesheet_link_tag "application", media: "all" %>

当我在本地生产模式下运行时,我没有收到该错误。

这是我的application.rb

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

# Pick the frameworks you want:
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "sprockets/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 SomeApp
  class Application < Rails::Application
    require "ksp"
    require "markdowner"
    require "patches/carrier_wave"
    VERSION = "1.0.0"
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Custom directories with classes and modules you want to be autoloadable.
    # config.autoload_paths += %W(#{config.root}/extras)

    # Only load the plugins named here, in the order given (default is alphabetical).
    # :all can be used as a placeholder for all plugins not explicitly named.
    # config.plugins = [ :exception_notification, :ssl_requirement, :all ]

    # Activate observers that should always be running.
    # config.active_record.observers = :cacher, :garbage_collector, :forum_observer

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
    # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
    # config.time_zone = "Central Time (US & Canada)"

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # config.i18n.load_path += Dir[Rails.root.join("my", "locales", "*.{rb,yml}").to_s]
    # config.i18n.default_locale = :de

    # Configure the default encoding used in templates for Ruby 1.9.
    config.encoding = "utf-8"

    # Configure sensitive parameters which will be filtered from the log file.
    config.filter_parameters += [:password]

    # Enable escaping HTML in JSON.
    config.active_support.escape_html_entities_in_json = true

    # Use SQL instead of Active Record"s schema dumper when creating the database.
    # This is necessary if your schema can"t be completely dumped by the schema dumper,
    # like if you have constraints or database-specific column types
    # config.active_record.schema_format = :sql

    # Enforce whitelist mode for mass assignment.
    # This will create an empty whitelist of attributes available for mass-assignment for all models
    # in your app. As such, your models will need to explicitly whitelist or blacklist accessible
    # parameters by using an attr_accessible or attr_protected declaration.
    config.active_record.whitelist_attributes = true

    # Enable the asset pipeline
    config.assets.enabled = true

    # Version of your assets, change this if you want to expire all your assets
    config.assets.version = "1.0"

    config.generators do |generator|
      generator.test_framework :rspec, view_specs: false
    end

    config.assets.prefix = "/assets/#{Rails.env}"

    config.filepicker_rails.api_key = ENV["FILEPICKER_API_KEY"]

    # Allow for CORS requests
    config.middleware.use Rack::Cors do
      allow do
        origins "*"
        resource "*", headers: :any, methods: [:get, :post, :options]
      end
    end
  end
end

这是我的production.rb

SomeApp::Application.configure do
  # Settings specified here will take precedence over those in config/application.rb

  # Code is not reloaded between requests
  config.cache_classes = true

  # Full error reports are disabled and caching is turned on
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  # Disable Rails's static asset server (Apache or nginx will already do this)
  config.serve_static_assets = false

  # Compress JavaScripts and CSS
  config.assets.compress = true

  # Don't fallback to assets pipeline if a precompiled asset is missed
  config.assets.compile = false

  # Generate digests for assets URLs
  config.assets.digest = true

  # Defaults to nil and saved in location specified by config.assets.prefix
  # config.assets.manifest = YOUR_PATH

  # Specifies the header that your server uses for sending files
  # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
  config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx

  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  # config.force_ssl = true

  # See everything in the log (default is :info)
  # config.log_level = :debug

  # Prepend all log lines with the following tags
  # config.log_tags = [ :subdomain, :uuid ]

  # Use a different logger for distributed setups
  # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)

  # Use a different cache store in production
  config.cache_store = :dalli_store

  # Enable serving of images, stylesheets, and JavaScripts from an asset server
  config.action_controller.asset_host = "d20eprk8nbwd96.cloudfront.net"

  # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
  # config.assets.precompile += %w( search.js )

  # Disable delivery errors, bad email addresses will be ignored
  # config.action_mailer.raise_delivery_errors = false
  config.action_mailer.default_url_options = { host: "www.someapp.org" }

  # Enable threaded mode
  # config.threadsafe!

  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
  # the I18n.default_locale when a translation can not be found)
  config.i18n.fallbacks = true

  # Send deprecation notices to registered listeners
  config.active_support.deprecation = :notify

  # Log the query plan for queries taking more than this (works
  # with SQLite, MySQL, and PostgreSQL)
  # config.active_record.auto_explain_threshold_in_seconds = 0.5
end

这是我的asset_sync.rb

if defined?(AssetSync) && !(ENV["HOME"] == "/app")
  AssetSync.configure do |config|
    config.fog_provider = "AWS"
    config.fog_directory = ENV["AMAZON_BUCKET"]
    config.aws_access_key_id = ENV["AMAZON_S3_KEY"]
    config.aws_secret_access_key = ENV["AMAZON_S3_SECRET"]

    # Increase upload performance by configuring your region
    config.fog_region = "us-west-2"
    #
    # Don't delete files from the store
    config.existing_remote_files = ENV["ASSET_SYNC_EXISTING_REMOTE_FILES"]
    #
    # Automatically replace files with their equivalent gzip compressed version
    config.gzip_compression = ENV["ASSET_SYNC_GZIP_COMPRESSION"]
    #
    # Use the Rails generated 'manifest.yml' file to produce the list of files to
    # upload instead of searching the assets directory.
    config.manifest = ENV["ASSET_SYNC_MANIFEST"]
    #
    # Fail silently.  Useful for environments such as Heroku
    # config.fail_silently = true
  end
end

这是我的application.css

 /*
 *= require bootstrap
 *= require bootstrap-responsive
 *= require font-awesome
 *= require chosen
 *= require bootstrap/tour
 *= require bootstrap/lightbox
 *= require_self
 */

在本地生产模式下,该方法为我提供了正确的前端URL。

这里出了什么问题?

1 个答案:

答案 0 :(得分:0)

尽管在本地进行了预编译,Heroku仍然试图在Heroku上进行预编译。

它会失败,然后尝试实时编译资产。然后,这将以所描述的方式失败。

我通过创建一个空文件/public/assets/manifest.yml解决了这个问题,即使我的配置说资产位于/public/assets/production/