開発環境で実行すると、アプリは正常に動作します。生産中 (Rails server -e production
)、ブラウザはcssおよびjsファイルにアクセスできず、コンソールには次のようなメッセージが表示されます。
I, [2013-07-27T21:00:59.105459 #11449] INFO -- : Started GET "/javascripts/application.js" for 99.102.22.124 at 2013-07-27 21:00:59 +0000
F, [2013-07-27T21:00:59.108302 #11449] FATAL -- :
ActionController::RoutingError (No route matches [GET] "/javascripts/application.js"):
実稼働環境でのHTMLソースのヘッドセクション:
<head>
<title>a Social Server</title>
<link data-turbolinks-track="true" href="/stylesheets/application.css" media="all" rel="stylesheet">
<link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css" rel="stylesheet">
<script data-turbolinks-track="true" src="/javascripts/application.js"></script>
<meta content="authenticity_token" name="csrf-param">
<meta content="jYM4IAXTXAuKWeD4FEVrXgXRNFeB6EazU68ZBQfRqNY=" name="csrf-token">
</head>
一方、開発環境では、ヘッドセクションは次のようになります。
<head>
<title>a Social Server</title>
<link data-turbolinks-track="true" href="/assets/application.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/Twitter-bootstrap-static/bootstrap.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/Twitter-bootstrap-static/fontawesome.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/bootstrap_and_overrides.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/instagram.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/socialserver.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.core.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.theme.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.accordion.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.menu.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.autocomplete.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.button.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.datepicker.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.resizable.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.dialog.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.progressbar.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.selectable.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.slider.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.spinner.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.tabs.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.tooltip.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.base.css?body=1" media="all" rel="stylesheet">
<link data-turbolinks-track="true" href="/assets/jquery.ui.all.css?body=1" media="all" rel="stylesheet">
<link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css" rel="stylesheet">
<script data-turbolinks-track="true" src="/assets/jquery.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery_ujs.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/Twitter/bootstrap/bootstrap-transition.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/Twitter/bootstrap/bootstrap-alert.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/Twitter/bootstrap/bootstrap-modal.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/Twitter/bootstrap/bootstrap-dropdown.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/Twitter/bootstrap/bootstrap-scrollspy.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/Twitter/bootstrap/bootstrap-tab.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/Twitter/bootstrap/bootstrap-tooltip.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/Twitter/bootstrap/bootstrap-popover.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/Twitter/bootstrap/bootstrap-button.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/Twitter/bootstrap/bootstrap-collapse.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/Twitter/bootstrap/bootstrap-carousel.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/Twitter/bootstrap/bootstrap-typeahead.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/Twitter/bootstrap/bootstrap-affix.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/Twitter/bootstrap.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/turbolinks.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.core.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.widget.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.accordion.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.position.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.menu.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.autocomplete.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.button.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.datepicker.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.mouse.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.draggable.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.resizable.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.dialog.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.droppable.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-blind.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-bounce.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-clip.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-drop.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-explode.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-fade.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-fold.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-highlight.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-pulsate.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-scale.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-shake.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-slide.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-transfer.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.progressbar.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.selectable.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.slider.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.sortable.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.spinner.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.tabs.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.tooltip.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.all.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/application.js?body=1"></script>
<meta content="authenticity_token" name="csrf-param">
<meta content="jYM4IAXTXAuKWeD4FEVrXgXRNFeB6EazU68ZBQfRqNY=" name="csrf-token">
</head>
アプリはデータベースを使用しないため、ActiveRecordを無効にしました。構成ファイルのスニペット:
application.rb
require File.expand_path('../boot', __FILE__)
#require 'Rails/all'
require "action_controller/railtie"
require "action_mailer/railtie"
require "Rails/test_unit/railtie"
require "sprockets/railtie"
Bundler.require(:default, Rails.env)
module Socialserver
class Application < Rails::Application
end
end
production.rb
Socialserver::Application.configure do
config.cache_classes = true
config.eager_load = true
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
config.serve_static_assets = false
config.assets.js_compressor = :uglifier
config.assets.compile = false
config.assets.digest = true
config.assets.version = '1.0'
config.log_level = :info
config.i18n.fallbacks = true
config.active_support.deprecation = :notify
config.log_formatter = ::Logger::Formatter.new
config.assets.paths << Rails.root.join('app', 'assets', 'fonts')
config.assets.precompile += %w( .svg .eot .woff .ttf )
end
development.rb:
Socialserver::Application.configure do
config.cache_classes = false
config.eager_load = false
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
config.action_mailer.raise_delivery_errors = false
config.active_support.deprecation = :log
config.assets.debug = true
end
Gemfile:
source 'https://rubygems.org'
gem 'Rails', '4.0.0'
gem 'sass-Rails', '~> 4.0.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-Rails', '~> 4.0.0'
gem 'jquery-Rails'
gem 'jquery-ui-Rails'
gem 'turbolinks'
gem 'jbuilder', '~> 1.2'
group :doc do
gem 'sdoc', require: false
end
group :Twitter do
gem 'Twitter', '4.8.1'
end
group :instagram do
gem 'instagram', '0.10.0'
end
group :tumblr do
gem 'tumblr_client'
end
gem 'Twitter-bootstrap-Rails'
gem 'therubyracer' #needed for runtime js on Amazon ec2.
たくさんの情報を投稿したことをおizeびします。情報は関連性があると感じました。
追伸Railsの知識は半分しかありませんので、ご容赦ください。ありがとう〜
実稼働環境をローカルでテストする場合、アセットをローカルでコンパイルする必要があります。以下のコマンドを実行するだけです:
Rails_ENV=production bundle exec rake assets:precompile
public/assets
の下にあるすべてのアセットが生成されます。
次に、アセット自体を提供するためにRailsを伝える必要があります。サーバーソフトウェア(たとえば、NginxまたはApache)はHerokuのような環境でそれを行いますが、ローカルでRailsしてください。production.rb
でこれを変更します。
config.serve_static_assets = true
ただし、コードを実稼働環境にプッシュする前に、必ずfalse
に設定してください。
これは 私が抱えていた問題 のように聞こえます。
ブログ を見つけました。これはRails 4.0.0アセットパイプラインのバグであり、設定することで不可解に軽減されます...
config.assets.compile = true
... config/environments/production.rb
アセットパイプラインを何らかの形で実際に機能させる以外に、その設定はアセットのライブコンパイルをオンにします。これは通常、実稼働環境でのパフォーマンスにとっては悪いことですが、デプロイするときにまだ手動でアセットをプリコンパイルする場合は、
rake assets:precompile
...ライブコンパイルが発生することはありません(必要なアセットが既にプリコンパイルされているため)。
これが役立つことを願っています:)
前述のように、config.serve_static_assets
は廃止され、config.serve_static_files
に置き換えられました。 Rails-4.2のconfig/environments/production.rb
を調べると、次のことがわかります。
# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.serve_static_files = ENV['Rails_SERVE_STATIC_FILES'].present?
export Rails_SERVE_STATIC_FILES="to any value whatsoever"
を実行する前にセッションで環境変数Rails s -e production
を(BASHで)設定およびエクスポートすると、ローカルでテストするときに望ましい結果が得られ、実稼働ホストにプッシュする前にproduction.rb
を再コーディングする必要がなくなります。
Production.rbで設定を変更します。
Rails 3.x
config.serve_static_assets = true
Rails 4.x
config.serve_static_files = true
次のようなファイルを確認します。
_public/assets/.sprockets-manifest-3f7771d777ceb581d754e4fad88aa69c.json
_
プリコンパイルされたアセットを本番サーバーにプッシュする場合、隠された「ドット」ファイルがプッシュされるのを防ぐ可能性があり、この重要なファイルは本番環境に入れません。
私の環境では、統合環境でアセットをプリコンパイルし、実稼働環境にプッシュする必要があります。これにより、実稼働マシンで資産をコンパイルする必要がなくなります。すべての隠しファイルが本番マシンにプッシュされるのを誤ってブロックしていました。
この回答が機能するかどうかを確認するには、実動サーバーからブラウザーで生成されたHTMLソースを確認し、アセットパスが生成されているかどうかを確認します。次のようなスクリプトタグが表示される場合:
_<script data-turbolinks-track="true" src="/javascripts/application.js"></script>
_
src属性を確認してください。 _/assets/javascript
_で始まる必要があります。この場合、それは_/javascript
_で始まり、Railsはどのアセットもプリコンパイルされていないと考えます。
プッシュを実稼働環境(現在はrsync)に更新し、統合サーバーでプリコンパイルした後に_.sprockets-manifest*
_ファイルをプッシュするようにして、これを修正しました。
また、静的ファイルのより現実的な処理を処理するため、WebrickではなくスタンドアロンのPassengerを統合テストサーバーとして使用します。
Rails 4.xは、アセットを実稼働環境にプリコンパイルするか、必要な場合でもconfig.assets.compileを使用する必要があります。
デフォルトのRails本番環境の動作は)です。プリコンパイルされたアセットが見つからない場合、アセットパイプラインにフォールバックしません。 "だから、しないでください。
config.assets.compile = false
このオプションを使用する場合、使用する必要はありません。
config.serve_static_files = true
アセットがプリコンパイルされていなかった場合、Railsはリクエストを提供する前にコンパイルされます。
ただし、制作前にアセットをプリコンパイルする場合は、config.assets.compile = true
、しかしあなたはconfig.serve_static_files = true
to Railsプリコンパイル済みアセットを提供するhttp_serverがない場合、リクエストを提供します。
設定 config.serve_static_assets
は非推奨です。
DEPRECATION WARNING: The configuration option `config.serve_static_assets` has been renamed to `config.serve_static_files` to clarify its role (it merely enables serving everything in the `public` folder and is unrelated to the asset pipeline). The `serve_static_assets` alias will be removed in Rails 5.0. Please migrate your configuration files accordingly.
この回答が、読者に実際に何が起こるかを理解してもらうことを願っています
in Rails 5.x設定は
config/initializers/assets.rb:
Rails.application.config.public_file_server.enabled = true
次のコマンドはローカルで機能します。
Rails server -e production
「Rails s」の実行中に同じエラー「ActionController :: RoutingError(No route matches [GET] "/assets/application.css"」が発生しました。ソースをプリコンパイルした後でも、config precompileをtrueに変更します。正しく。
オプション「-e production」により、これらのRoutingErrorが消えました。