アセットパイプラインを使用するようにアプリケーションをアップグレードしています。
Cssアセットをアプリケーションのcssファイルにコンパイルしましたが、実稼働モードでアプリケーションを実行したときにそれらが見つかりません
Rails_ENV=production bundle exec Rails s
そして、私はデータベースから正しい出力を取得しますが、スタイルとログが表示されないページにアクセスします:
ActionController::RoutingError (No route matches [GET]
"/assets/default.scss-1a27c...f07c.css"):
そのファイルはpublic/assetsに存在しますが
$ ls public/assets/def*
public/assets/default.scss-1a27c...f07c.css public/assets/default.scss.css
public/assets/default.scss-1a27c...f07c.css.gz public/assets/default.scss.css.gz
サーバーがアセットファイルを見つけるために何を変更する必要がありますか?
私の他の.cssファイルでも同じことが起こります。それらは指紋で公開/資産にコンパイルされますが、その後は見つかりません。
ページのソースが表示されています:
<link href="/assets/default.scss-1a27c...f07c.css"
media="screen" rel="stylesheet" type="text/css" />
Rails(haml)ソースは= stylesheet_link_tag 'default.scss.css'
public.assets
現在、次のファイルが含まれています。
$ ls public/assets/def*
public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css
public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css.gz
public/assets/default.scss.css
public/assets/default.scss.css.gz
application.rbには
$ cat config/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 Linker
class Application < Rails::Application
config.encoding = "utf-8"
config.filter_parameters += [:password]
config.assets.enabled = true
config.assets.initialize_on_precompile = false # For Heroku
config.assets.version = '1.0'
end
end
config/environments/production
があります:
$ cat config/environments/production.rb
Linker::Application.configure do
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
config.assets.precompile += ['default.scss.css','main.css', 'jquery-ui-1.8.22.custom.css']
config.serve_static_assets = false
config.assets.compress = true
config.assets.compile = false
config.assets.digest = true
config.log_level = :debug
config.i18n.fallbacks = true
config.active_support.deprecation = :notify
end
これはすべてのアセットで発生しているようです。
Started GET "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css"):
Started GET "/assets/main-6864687b4114a1c316e444bd90f233ff.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/main-6864687b4114a1c316e444bd90f233ff.css"):
Started GET "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css"):
Started GET "/assets/application-fc1d492d730f2a45581a40eac4607db8.js" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/application-fc1d492d730f2a45581a40eac4607db8.js"):
Started GET "/images/link.ico" for 127.0.0.1 at 2014-02-23 10:24:48 -0500
ActionController::RoutingError (No route matches [GET] "/images/link.ico"):
デフォルトでは、Railsはpublic
の下のアセットを提供しません。 production.rb
をご覧ください:
config.serve_static_assets = true
これをtrueに変更すると、準備完了です。 (注:本番環境ではtrue
にしたくないので、デプロイする前に元に戻すことを忘れないでください!)
詳細については、 Configuring Rails Applications を参照してください。
Rails 6で、デフォルトのproduction.rb
には行が必要です
config.public_file_server.enabled = ENV['Rails_SERVE_STATIC_FILES'].present?
だからあなたのサーバーを実行します
Rails_SERVE_STATIC_FILES=true Rails server -e production
またはconfig.public_file_server.enabled=true
にproduction.rb
を設定します。 Rails 4および5。
Rails 5のソリューションは、上記のJules Copelandによって与えられた Rails 4のソリューション に似ています。
事前に生成されたconfig/environments/production.rb
ファイルには、次のようなエントリが必要です。
# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.public_file_server.enabled = ENV['Rails_SERVE_STATIC_FILES'].present?
http://guides.rubyonrails.org の Configuring Rails Applications guide )でこの設定の適切な説明を見つけました。
config.public_file_server.enabled configures Rails publicディレクトリから静的ファイルを提供します。このオプションはデフォルトでtrueに設定されていますが、実稼働環境ではサーバーソフトウェア(NGINXやApacheなど) )アプリケーションを実行するために使用する場合は、代わりに静的ファイルを提供する必要があります。ページキャッシングを使用して、パブリックディレクトリの下に存在するファイルを要求します。
結論:本番環境では、RailsサーバーをRails_SERVE_STATIC_FILES=1
は、RailsがWebサーバーと同じようにpublic/assetsディレクトリ内のファイルを提供できるようにします。Railsはアプリサーバーであり、 Webサーバー(NGINX、Apacheなど)ほど効率的にこれを行いません。実際のアプリケーションでは、Railsの前に専用のWebサーバーを配置する必要があります。静的アセットのみで、必要に応じてRails動的コンテンツの場合のみ。詳細については、Webサーバーとアプリサーバーの違いについて この記事 を参照してください。
Rails 4では、環境変数を渡すことで、本番環境(ローカルで実行)で表示することができます。
Rails_SERVE_STATIC_FILES=true Rails server -e production
/config/environments/production.rb
に次の行がある限り、これは機能するはずです。
config.serve_static_files = ENV ['Rails_SERVE_STATIC_FILES']。present?
rake assets:precompile
を実行すると、アセットはパブリックディレクトリに移動します。これらのファイルがpublic/assets/
で見つかるかどうかを確認してください
次のようなものが表示されるはずです。
I, [2014-02-23T20:06:21.853314 #26915] INFO -- : Writing app_root/public/assets/application-ecd8636fc80ea2b712039c4abc365da9.css