

railsのassets:precompileをrailsが稼働中に実行して、再起動無しにそのまま反映させようと考えております。

【最終目標】

  * 登録ユーザーは各自のプロフィールページを持つ。
  * プロフィールページはユーザー毎に個別のCSSを持つ。
  * ユーザーはCSSのパラメータを変更できる。
  * ユーザーがCSSを変更したら、バックグラウンドでassets:precompileを実行する。
  * assets:precompileが完了したら、プロフィールページに反映される。

【現状と問題点】  
ユーザーのCSS変更受け付けとそれをscssファイルに反映させるところまでは完成いたしました。ただその反映はrake
assets:precompileを実行しても、即座に反映されません。一旦サーバー（rails s）を停止し、再度起動 （もう一度 $ rails
s）することで反映されます。

サーバーの再起動無しにCSS変更が反映されるようにしたいと考えております。  
どのように実装すればこれが可能か教えていただけますでしょうか？

【現状内容】  
ローカル環境にて確認するため。development環境設定をproductionと同じに書き換える。

[code]

    # 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
    
[/code]

Railsサーバーを立ち上げる

[code]

    $ rails s
    
[/code]

ユーザーのプロファイルページへアクセスする。現状のcssを読み込んでいるログが見える。

[code]

    INFO -- : Started GET "/assets/application-8bbf8d83f787bfc34b831bf49ce85bae1fc1ac7d8589f27607c326df773d8a4f.css" for ::1
    
[/code]

CSS編集ページから入力してCSSファイルを変更する。  
app/assets/stylesheets/にユーザ毎のscssファイルがあり、入力にしたがって更新される。  
例 id: 3のユーザーのためのscssファイル  
ユーザー３の入力 => color: red, size: 44

[code]

    # app/assets/stylesheets/3_user.scss
    h1.user_3 { 
      color: red;
      font-size: 44px;
    }
    
[/code]

rake assets:precompileを実行するとフィンガープリントが更新される。

[code]

    $ bundle exec rake assets:precompile RAILS_ENV=development
    INFO -- : Writing /public/assets/application-140f7622546843fcda02f1312e5cd500bcb5ae16f3688b14cdb86e91432f9a68.css
    
[/code]

ブラウザをリロードして、同じユーザープロファイルを表示させ、そのログを確認すると、プリコンパイル前とまったく同じフィンガープリントになっている。ページのCSSにも更新内容が反映されていない。

[code]

    INFO -- : Started GET "/assets/application-8bbf8d83f787bfc34b831bf49ce85bae1fc1ac7d8589f27607c326df773d8a4f.css" for ::1
    
[/code]

サーバを再起動して、同じページにアクセスしログで確認するとフィンガープリントが新しいのに切り替わって、ブラウザから見えるページ内容も更新されている。

[code]

    INFO -- : Started GET "/assets/application-140f7622546843fcda02f1312e5cd500bcb5ae16f3688b14cdb86e91432f9a68.css" for ::1
    
[/code]

更新の反映になぜサーバー再起動が必要になるのでしょうか？ローカルのフォルダ（public/assets/）を確認しても確実に新しいフィンガープリントのついたファイルができているのになぜそれが稼働中のままだとウェブブラウザに反映されないのでしょうか？


CC BY-SA 3.0
2016-08-12T07:49:45.383
28209
2018-03-29T11:39:26.440
14900
question
ruby-on-rails ruby
railsのassets:precompileをrails稼働中に実行して反映させる方法は？


＞ 更新の反映になぜサーバー再起動が必要になるのでしょうか？  
おそらく、サーバ起動時に layout/application.*
が返すべきCSS名を変数に取り込んでいるのでしょうね。その変数がわかれば書変えればよいのでしょうが。

編集したCSSを public/どこか にユーザユニークな名前で保存し、  
layout/application.* にそれを読み込むコードを  
`<link rel="stylesheet" href="/どこか/<%= current_user.css_filename %>" />`
のように記述したらどうでしょう


CC BY-SA 3.0
2016-11-24T03:20:33.690
30637
2016-11-24T03:20:33.690
19645
28209
answer