Лучший способ справиться с динамическим CSS в приложении Rails

Я исследую проблему обработки динамического CSS в приложении rails. Внутри приложения отдельные пользователи и / или группы пользователей могут иметь индивидуальный внешний вид, который достигается с помощью CSS. Не будет фиксированного количества файлов "look and feel" или css, их число будет расти по мере роста количества пользователей и групп, а внешний вид и внешний вид будут определяться пользователями через интерфейс администратора приложения. В течение обычного дня будут подаваться тысячи (а не десятки тысяч) различных вариаций css. Приложение будет хранить предварительно собранные css в mongodb, поэтому там не придется платить цену за создание css для каждого запроса, вопрос в том, как лучше всего обслуживать этот динамический css контент. Я видел другие вопросы, такие как [этот][1], в которых говорится об использовании erb или sass, но некоторые из этих ответов датированы несколькими годами, поэтому я хотел убедиться, что в Rails 3 не было лучшего ответа.

5 ответов

Вы можете рассматривать ваши CSS-файлы как ресурсы, хранить их в базе данных и обслуживать их с помощью кэширования страниц, так что вам нужно всего лишь один раз нажать на db при изменении 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" />

Ну, я работал с этим пару раз, но они определенно не исправили ни одного CSS-файла на выбор. Его должно быть то же самое более или менее.

Одной из вещей, которые я использовал много, были блоки content_for. В принципе

<% content_for: css do%>
 // какой-нибудь css файл или css контент<% end%>

И в макете

<% = доходность: css%>
 

очень простой способ управления макетами.

Это может дать вам несколько идей: несколько robots.txt для поддоменов в rails

Теперь предположим, что у вас есть динамический стиль, называемый dynamic.css.scss.erb (в конце важен.erb!) В app/assets/stylesheets. Он будет обработан erb (а затем Sass), и поэтому может содержать такие вещи, как

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

}

У меня была похожая проблема - но нужно было обслуживать модифицированный CSS только один раз. Я храню пару констант в модуле "Сайт", который затем я могу использовать как константы в CSS или как константы в приложении Rails. Я автоматически генерирую файлы CSS каждый раз, когда приложение Rails перезапускается, и входные файлы CSS изменяются.

Вы можете сделать что-то подобное, но ссылаться на символические имена в site_settings.rb, а затем извлекать их для каждого пользователя из MongoDB.

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

Другие вопросы по тегам