2012-12-13 1 views
8

にコンパイルします。その私はRailsのやRubyに触れてきたので、私は両方のさびよ、プラスIはレールを使用し、最後の時間は2.3 Railsのだったされているので3年ぶり。言うまでもなく、下記の「簡単な」質問をお許しください。ここでダイナミックCSS、私はRailsの3.2でサイトを構築していますフライ

スペック

  • マルチテナントCMS /ストアサイト
  • は、それぞれの "ストア"(別名サブドメインです)は、CSSのカスタマイズによって独自の外観、感触などを持つことができます0
    • カスタマイズはブートストラップの基本変数を変更することをユーザに可能にするアプリ内でUIに行うことができる(すなわち、 @textColor@bodyBackgroundなど)
  • 私はここなど、Twitterのブートストラップルック/フィールに

less-rails-bootstrap宝石を使用しています私はする必要が挑戦

  1. です動的に出力できるので、変数は、ユーザがCSのための変数を変更すると、最終的なCSS
  2. を作成するためにピックアップされるブートストラップすることで混入したファイルにCSSの変数Sでは、既存のスタイルは基本的に無効にされます。私は、サブドメインごと吐き出すために異なるCSSを必要とするフルCSS再コンパイルし、ディスクに書き戻さ、メモリストリーム、または私はそれを私の手を得ることができますいくつかの他の場所(これはlessを使用している覚えている)
  3. を必要としています。これにアプローチする方法に関する提案はありますか?私は基本的に私は、一般的にはないだろうGEMSを含める必要が意味し、その場でCSSをコンパイルするためにいくつかの方法を見つける必要がありますことを考えるとさらに

問題を複雑に ...

...プロダクション環境。パフォーマンスは非常に重要です。これを分離する方法はありますか? CSSが無効化されて再生成されたら、コンテンツを取り出してディスクに書き込むか、memcached/redis/etcに保存することができます。パフォーマンスのためのインスタンス。ただ、一般的な方向に私を指すようにしても

すべてのコメントは、いただければ幸いです。

ありがとうございます!ここで

+0

あなたは、変更されたものに対して動的に追加されたスクリプトに '!important'のようなルールを追加することができます。それでは、このすべての再コンパイルを行う必要はありません – AJcodez

+0

ここでの目標の一部は、CSSの変数の利点を活用できるようにすることです。これらの変数は、ブートストラップのソースファイルで再利用されます。その一例は、変数 '@ purple'です。これにより、使用したい "紫"の色(色相/彩度など)を指定することができます。これは、ブートストラップ内で複数の場所で使用されます。残念ながら、通常のCSSはここでは動作しません。 –

+0

Ryan、私はBootstrap変数を利用したいので、あなたと同じ答えを探しています。もちろん、物事は即座にコンパイルされるので、開発中に動作します。私は顧客の少ないファイルをlib/assets/stylesheets/customersに保存している点で似たようなことをしています。次に、私のapplication.html.erbファイルで、サイトがサブドメインでアクセスされたかどうかを確認してから、適切なファイルを提供しています(サブドメインの後に.lessファイルの名前を付けています)。あなたはこれを理解したことがありますか?もしそうでなければ、私はあなたの質問に私自身のポイントの恩恵を追加しますので、私はそれを欺いていません。 – AKWF

答えて

3

は私が最終的に上陸したソリューションです:私はbootstrap-sassに切り替えることになった

  • 代わりhttps://github.com/thomas-mcdonald/bootstrap-sass
  • :assetグループは、常にもかかわらず、含まれていることを確認するために私のapplication.rbファイルに次の変更を加えました環境:

    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 
    
  • ura Meure(ありがとうマヌエル!)クラウトコンピューティングのhttp://www.krautcomputing.com/blog/2012/03/27/how-to-compile-custom-sass-stylesheets-dynamically-during-runtime/に見つかりました。

    • 私は自分のニーズに合わせていくつかの調整を行いましたが、マヌエルが示したコアコンセプトは私の編集プロセスの基礎でした。

    # .../app/models/site.rb 
    ... 
    
    BASE_STYLE = " 
        @import \"compass/css3\"; 
    
        <ADDITIONAL_STYLES> 
    
        @import \"bootstrap\"; 
        @import \"bootstrap-responsive\"; 
    ".freeze 
    
    # Provides the SASS/CSS content that would 
    # be included into your base SASS content before compilation 
    def sass_content 
        " 
        $bodyBackground: #{self.body_background}; 
        $textColor: #{self.text_color}; 
        " + self.css # Any additional CSS/SASS you would want to add 
    end 
    
    def compile_css(test_only = false, force_recompile = false) 
    
        # SassCompiler is a modification of the information made available at the Kraut Computing link 
        compiler = SassCompiler.new("#{self.id}/site.css", {:syntax => :scss, :output_dir => Rails.root.join('app', 'assets', 'sites')}) 
    
        # Bail if we're already compiled and we're not forcing recompile 
        return if compiler.compiled? && !force_recompile && !test_only 
    
        # The block here yields the content that will be rendered 
        compiler.compile(test_only) { 
        # take our base styles, slap in there some vars that we make available to be customized by the user 
        # and then finally add in our css/scss that the user updated... concat those and use it as 
        # our raw sass to compile 
        BASE_STYLE.gsub(/<ADDITIONAL_STYLES>/, self.sass_content) 
        } 
    end 
    
    が、私はこのことができます願っています:私のモデルでは
  • は、私がこのようなコードのスニペットを持っている( "サイト" それを呼び出すことができます)。私は元の投稿からの逸脱を知っていますが、これが問題の最も達成可能な解決策であるように見えたので、その逸脱しています。

    私があなたが持っている特定の質問に答えなかった場合は、可能な限り拡大できるように自由にコメントしてください。

    ありがとうございます!

  • +0

    私はHerokuにこれを展開する方法を知っていたのか不思議です。すべての展開が 'initialize_on_precompile = false'でなければならないからです。 – Trip

    +0

    @Trip、私はあなたに良い答えがあったらいいのに。私がRailsの土地にいたときからちょっとだったので、この作品に出会ったのかどうかは思い出せません。あなたがこれを拡大できるように感じたら、私の答えを編集してください。 –

    +1

    ああ、私は答えを見つけました。本当に設定して展開することは可能です。単にHerokuのデフォルトビルドパックを使用するだけです。これは技術的にはデフォルトで実行する必要があります。私の間違いは2年前のことで、同じアプリにはカスタムのものがいくつか作成されていて、それは数人の開発者が手を加えていたものです。 – Trip