8

Rails 3.2 でサイトを構築しています。Rails や Ruby に触れてから 3 年が経ち、どちらもさびついており、最後に Rails を使用したのは Rails 2.3 でした。言うまでもなく、以下の「簡単な」質問はご容赦ください。

ここに仕様があります

  • マルチテナントCMS・店舗サイト
  • 各「ストア」(別名サブドメイン) は、CSS のカスタマイズを通じて独自のルックアンドフィールなどを持つことができます。
    • カスタマイズはアプリ内の UI で実行できるため、ユーザーは Bootstrap の基本変数 ( 、 など) を変更でき@textColorます@bodyBackground
  • less-rails-bootstrapTwitter Bootstrap のルック/フィールなどに gem を使用しています。

ここに課題があります

  1. CSS の変数をファイルに動的に出力して Bootstrap に取り込ませる必要があるため、最終的な CSS を作成するために変数が取得されます。
  2. ユーザーが CSS の変数を変更すると、既存のスタイルは基本的に無効になります。完全な CSS を再コンパイルして、ディスク、メモリ ストリーム、またはそれを利用できるその他の場所に書き戻す必要があります (これは を使用していることを思い出してくださいless) 。
  3. サブドメインごとに吐き出すには、異なる CSS が必要です。これにアプローチする方法について何か提案はありますか?

さらに事態を複雑に…

...基本的に、CSS をオンザフライでコンパイルする何らかの方法を見つけなければならないことを考えると、GEMS を含める必要があることを意味します。これは、本番環境では通常行わないものです。パフォーマンスは非常に重要になります。これを隔離する方法はありますか?CSS が無効化されて再生成されたら、コンテンツを取り出してディスクに書き出すか、memcached/redis/etc に保存します。パフォーマンスのインスタンス。

一般的な方向性を示すだけでも、コメントをいただければ幸いです。

ありがとう!

4

1 に答える 1

3

これが私が最終的にたどり着いた解決策です:

  • bootstrap-sass代わりにhttps://github.com/thomas-mcdonald/bootstrap-sassに切り替えることになりました
  • 環境に関係なくグループが常に含まれるように、application.rbファイルに次の変更を加えました。:asset

    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
    
  • http://www.krautcomputing.com/blog/2012/03/27/how-to-compile-custom-sass-stylesheets-dynamically-にある Kraut Computing の Manuel Meure (Thank you Manuel!) によって提供された概念を使用しました実行中/ .

    • 私は自分のニーズに合わせていくつかの調整を行いましたが、Manuel が示したコア コンセプトは、私のコンパイル プロセスの基礎となりました。
  • 私のモデル (「 Site 」と呼びましょう) には、次のようなコードのスニペットがあります。

    # .../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
    

これが役立つことを願っています。元の投稿からの逸脱であることは知っていますが、これが問題の最も達成可能な解決策であると思われたため、逸脱しています。

特定の質問にまだ答えていない場合は、お気軽にコメントしてください。可能な限り詳しく説明します。

ありがとう!

于 2013-02-26T15:03:05.543 に答える