Лучший способ справиться с динамическим 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