railsのassets:precompileをrails稼働中に実行して反映させる方法は?
railsのassets:precompileをrailsが稼働中に実行して、再起動無しにそのまま反映させようと考えております。
【最終目標】
- 登録ユーザーは各自のプロフィールページを持つ。
- プロフィールページはユーザー毎に個別のCSSを持つ。
- ユーザーはCSSのパラメータを変更できる。
- ユーザーがCSSを変更したら、バックグラウンドでassets:precompileを実行する。
- assets:precompileが完了したら、プロフィールページに反映される。
【現状と問題点】
ユーザーのCSS変更受け付けとそれをscssファイルに反映させるところまでは完成いたしました。ただその反映はrake assets:precompileを実行しても、即座に反映されません。一旦サーバー(rails s)を停止し、再度起動 (もう一度 $ rails s)することで反映されます。
サーバーの再起動無しにCSS変更が反映されるようにしたいと考えております。
どのように実装すればこれが可能か教えていただけますでしょうか?
【現状内容】
ローカル環境にて確認するため。development環境設定をproductionと同じに書き換える。
# config/environments/development.rb
Rails.application.configure do
config.cache_classes = true
config.eager_load = true
config.consider_all_requests_local = true
config.action_controller.perform_caching = true
config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
config.assets.js_compressor = :uglifier
config.assets.compile = true
config.assets.digest = true
config.log_level = :debug
config.i18n.fallbacks = true
config.active_support.deprecation = :notify
config.log_formatter = ::Logger::Formatter.new
config.active_record.dump_schema_after_migration = false
end
Railsサーバーを立ち上げる
$ rails s
ユーザーのプロファイルページへアクセスする。現状のcssを読み込んでいるログが見える。
INFO -- : Started GET "/assets/application-8bbf8d83f787bfc34b831bf49ce85bae1fc1ac7d8589f27607c326df773d8a4f.css" for ::1
CSS編集ページから入力してCSSファイルを変更する。
app/assets/stylesheets/にユーザ毎のscssファイルがあり、入力にしたがって更新される。
例 id: 3のユーザーのためのscssファイル
ユーザー3の入力 => color: red, size: 44
# app/assets/stylesheets/3_user.scss
h1.user_3 {
color: red;
font-size: 44px;
}
rake assets:precompileを実行するとフィンガープリントが更新される。
$ bundle exec rake assets:precompile RAILS_ENV=development
INFO -- : Writing /public/assets/application-140f7622546843fcda02f1312e5cd500bcb5ae16f3688b14cdb86e91432f9a68.css
ブラウザをリロードして、同じユーザープロファイルを表示させ、そのログを確認すると、プリコンパイル前とまったく同じフィンガープリントになっている。ページのCSSにも更新内容が反映されていない。
INFO -- : Started GET "/assets/application-8bbf8d83f787bfc34b831bf49ce85bae1fc1ac7d8589f27607c326df773d8a4f.css" for ::1
サーバを再起動して、同じページにアクセスしログで確認するとフィンガープリントが新しいのに切り替わって、ブラウザから見えるページ内容も更新されている。
INFO -- : Started GET "/assets/application-140f7622546843fcda02f1312e5cd500bcb5ae16f3688b14cdb86e91432f9a68.css" for ::1
更新の反映になぜサーバー再起動が必要になるのでしょうか?ローカルのフォルダ(public/assets/)を確認しても確実に新しいフィンガープリントのついたファイルができているのになぜそれが稼働中のままだとウェブブラウザに反映されないのでしょうか?