2011-01-18 12 views
18

レールアプリでダイナミックCSSを処理する際の問題を研究しています。アプリ内では、個々のユーザーやユーザーのグループが、CSSを使用してカスタマイズされたルックアンドフィールを持つことができます。固定された数の「ルック・アンド・フィールズ」やCSSファイルはなく、ユーザ数やグループ数が増えるにつれて数字が大きくなり、アプリケーションの管理インターフェースを介してユーザがルック・アンド・フィールを定義します。典型的な日中、数千(数万ではありません)の異なる種類のCSSが提供されます。アプリはmongodbにあらかじめ構築されたCSSを保存するので、すべての要求に対してCSSを作成する代償を支払う必要はありません。この動的なCSSコンテンツをどのように提供するのが最善の方法でしょうか?私はerbやsassを使っている[この1] [1]のような他の質問を見たことがありますが、これらの回答のいくつかは数年前ですので、Rails 3の方が良い答えがないか確かめたいと思っていました。レールアプリでダイナミックCSSを処理する最良の方法

+0

ようなものを含むことができ、なぜディスク上のCSSファイルに格納しないであろうユーザーのIDに結びついたファイル名を持つパブリックディレクトリ内にありますか?そうすれば、あなたは通常(CSSの頭にリンクタグを使って)CSSを提供し、ブラウザのキャッシュを利用することができます。変更が行われるたびに、キャッシュをクリアして編集時ベースのキャッシュバスターをリンクタグsrcに追加することができます。 –

答えて

1

これはあなたにいくつかのアイデアを与えるかもしれない:Multiple robots.txt for subdomains in rails

+0

説明なしでは、これはまったく「答え」ではありませんが、それは大きな貢献です。 –

38

あなたは、リソースとして、あなたのCSSファイルを扱うデータベースに保存して、あなたは一度だけデシベルをヒットする必要があるように、page cachingでそれらを提供することができます CSSが変更されたとき。すべての後のリクエストは、アプリまたはデータベースに触れることなく、キャッシュからWebサーバーによって直接処理されます。

# stylesheet.rb 
class Stylesheet < ActiveRecord::Base 
    validates_presence_of :contents 
end 

# stylesheets_controller.rb 
class StylesheetsController < ApplicationController 
    caches_page :show # magic happens here 

    def show 
    @stylesheet = Stylesheet.find(params[:id]) 
    respond_to do |format| 
     format.html # regular ERB template 
     format.css { render :text => @stylesheet.contents, :content_type => "text/css" } 
    end 
    end 
    # the rest is your typical RESTful controller, 
    # just remember to expire the cache when the stylesheet changes 
end 

# routes.rb 
resources :stylesheets 

# layouts/application.html.erb 
… 
<link href="<%= stylesheet_path(@current_user.stylesheet) %>" rel="stylesheet" type="text/css" /> 
+0

私はこのアプローチを試みていますが、問題にぶつかっています。私は私のCSSのボディ要素の背景画像を持っていますが、これはCSSが要求されたときに要求されていません。 –

+0

'background:url( '/ assets/image.jpg')' –

+0

を使用すると、私の背景イメージが正しくレンダリングされます。私のブラウザがmy linkタグを次のように解釈するためにstylesheet_path(resource)ルートを埋め込み、 "#{stylesheet_link_tag(stylesheet)} .ss" – dennis

3

私はこれを数回使っていますが、間違いなくCSSファイルを選択できませんでした。それは多かれ少なかれ同じでなければなりません。

私が多く使ったことの1つは、content_forブロックです。レイアウトを管理するための基本的

 
<% content_for :css do %> 
// some css file or css content 
<% end %> 

とレイアウトで

 
<%= yield :css %> 

非常に単純な方法。

0

私は同様の問題がありましたが、変更されたCSSを一度だけ提供する必要がありました。 2つの定数を1つのモジュール 'Site'に格納します。これをCSSの定数として使うことも、Railsアプリケーション全体の定数として使うこともできます。 Railsアプリケーションが再起動しCSSの入力ファイルが変更されたときにCSSファイルを自動生成します。

あなたは似た何かをするが、参照シンボル名site_settings.rb にして、今度はあなたがダイナミックと呼ばれる、いくつかのダイナミックなスタイリングを持っているとしましょうMongoDBの

http://unixgods.org/~tilo/Ruby/Using_Variables_in_CSS_Files_with_Ruby_on_Rails.html

0

からユーザーごとにこれらを取得することができ.css.scss.erb(最後の.erbは重要です!)のapp/assets/stylesheetsにあります。これは、ERBによって処理され(そしてサスにより)、その代わりにMongoDBにCSSを記憶するよう

.some_container { 
<% favorite_tags do |tag, color| %> 
.tag.<%= tag %=> { 
    background-color: #<%= color %>; 
} 
<% end %> 

}

関連する問題