2017-03-16 11 views
1

css.scss.erbファイルをコードに使用しています。モデルへのこのファイルアクセスは、各ループを繰り返してCSSファイルを作成します。時々、ファイルをやり直す必要があります(モデルが変更されたとき)。プロダクションの動的プリコンパイル資産

**stylesheets/utils/_comunicaciones.css.scss.erb** 

    <%Producto.all.each do |img| %> 
    <%unless img.portada.blank?%> 
    ##{$id}--<%=img.id%> { 

     &:before { 
      background: url('<%= img.portada.url(:icon_lands) %>'); 

      background-position: $bg-position; 
      background-size: $bg-size; 
      background-repeat: $bg-repeat; 
     } 
    } 
    <%end%> 
    <%end%> 

私たちは、このinsueための設定/初期化子/ assets.rbでconfig.assets.precompileラインを入れました。

Rails.application.config.assets.precompile += %w(stylesheets/utils/_comunicaciones.css.scss.erb) 
Rails.application.config.assets.precompile += %w('*.css.scss.erb') 

開発モードで動作させるには、モデルが変更されたときにファイルの変更を行います。

class ProductoImagen < ActiveRecord::Base 
before_save :precompilar 
belongs_to :producto 

    def precompilar 
    fichero = File.read('app/assets/stylesheets/utils/_comunicaciones.css.scss.erb').split('/* #=cambios')[0].to_s + '/*' + " #=cambios " + Time.now.to_s + '*/' 
    File.open('app/assets/stylesheets/utils/_comunicaciones.css.scss.erb','w') {|f| f.write(fichero)} 
    #Rails.application.load_tasks 
    #Rake::Task['assets:precompile'].invoke 
end 

プロダクションモードでファイルを変更するにはどうすればよいですか? ファイルを再プリコンパイルしてからアプリケーションを再ロードするにはどうすればよいですか?

+0

プリコンパイルされたアセットはそのまま残してください。事前コンパイル済み(再コンパイルされていない)。矛盾の可能性(書き出し中に読む)のために、資産のコンパイルとランタイムを強制することは、良い考えでもなく、良い方法でもありません。おそらく、実行時にコンパイルされて提供されるビュー内に配置するべきです。 [Railsキャッシュ](http://guides.rubyonrails.org/caching_with_rails.html)も使用できます。 – Wikiti

+0

これは管理作業時にのみ再コンパイルされます。数回で問題のあなたの見解に感謝します。しかし、それは可能性がありますか? –

+0

アセットパイプラインが実行時にアクセスできるかどうかわかりません。これらのファイルを提供する新しいコントローラを作成し、それらをdemmand上であらかじめコンパイルすることができます。 – Wikiti

答えて

0

必要なものをプリコンパイルする必要はありません。ちょうどあなたのhtmlのスタイルを埋め込む:もちろん

<html> 
    <head> 
    <!-- some static styles --> 
    <link rel="stylesheet" href="/application.css"> 

    <!-- dynamic styles --> 
    <style> 
     <%Producto.all.each do |img| %> 
      ##{$id}--<%=img.id%> { 
       background: url('<%= img.portada.url(:icon_lands) %>'); 
       background-position: $bg-position; 
       background-size: $bg-size; 
       background-repeat: $bg-repeat; 
      } 
     } 
     <%end%> 
    </style> 
    </head> 

    <body> 
     <!-- some html --> 
    </body> 
</html> 

を、部分的またはヘルパーにこのコードを貼り付けた方がよいでしょう。

+0

はい私はこのオプションを知っています。しかし、私はコードとスタイルを分けた方が良いと思います。 –

関連する問題