2011-01-18 3 views
18

레일즈 앱에서 동적 CSS를 처리 할 때 문제가 발생했습니다. 앱 내에서 개별 사용자 및/또는 사용자 그룹은 CSS를 통해 완성 된 모양과 느낌을 사용자 정의 할 수 있습니다. 고정 된 수의 "룩앤필"또는 CSS 파일은 없으며 사용자 및 그룹 수가 증가함에 따라 숫자가 커지고 모양과 느낌이 응용 프로그램의 관리 인터페이스를 통해 사용자에 의해 정의됩니다. 일반적인 하루 동안 수천 가지의 CSS가 서로 다른 변형이 제공됩니다. 앱은 mongodb에 사전 빌드 된 CSS를 저장하므로 모든 요청에 ​​대해 CSS를 작성하는 대가를 지불 할 필요가 없으므로이 동적 CSS 컨텐츠를 제공하는 가장 좋은 방법은 무엇인가에 대한 질문입니다. 나는 [1]과 같이 erb 나 sass를 사용하는 것과 같은 다른 질문을 보았습니다. 그러나 이러한 답변 중 몇 년은 몇 년 전으로 거슬러 올라 가기 때문에 Rails 3에 대한 더 좋은 대답은 없었습니다.레일 앱에서 동적 CSS를 처리하는 가장 좋은 방법

+0

대신하여 MongoDB의 CSS를 저장하는 이유는 디스크상의 CSS 파일에 저장되지}

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

같은 재료를 포함 할 수있다 사용자의 ID에 연결된 파일 이름이있는 공용 디렉토리에 있습니까? 그런 식으로 당신은 정상적으로 (머리에 링크 태그를 통해) CSS를 제공하고 브라우저 캐싱을 이용할 수 있습니다. 변경이있을 때마다 캐시를 ​​지우고 편집 시간 기반 캐시 버스터를 링크 태그 src에 추가 할 수 있습니다. –

답변

38

당신은 , 자원로 CSS 파일을 처리 데이터베이스에 저장할, 당신은 한 번만 DB 을 칠 필요가 있도록 page caching로 서비스를 제공 할 수 CSS 수정시. 나중의 모든 요청은 앱 또는 데이터베이스를 만지지 않고도 캐시에서 웹 서버에 의해 직접 제공됩니다.

# 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

을 사용하면 제 배경 이미지가 올바르게 렌더링됩니다. 내 브라우저가 내 링크 태그를 다음과 같이 해석하도록 stylesheet_path (resource) 경로를 삽입하고 .css를 추가해야했습니다. css 유형과 함께 type = 'text/css'와 같이 : "# {stylesheet_link_tag (stylesheet)} .ss" – dennis

3

글쎄, 나는이 두 시간 동안 작업을했지만 확실히 CSS 파일을 선택할 수있는 문제가 없었습니다. 그 정도는 같아야합니다.

내가 많이 사용했던 것 중 하나는 콘텐츠 _ 블록이었습니다. 기본적으로

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

그리고

 
<%= yield :css %> 

매우 간단한 방법으로 레이아웃을 관리하기위한 레이아웃

.

0

나는 비슷한 문제가 있었지만 수정 된 CSS는 한 번만 제공해야했습니다. 두 개의 상수를 '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하여 (그리고 사스에 의해) 처리되며, 같은는

관련 문제