Ruby on rails Rails资源管道中的动态CSS,动态编译
我正在Rails 3.2中构建一个站点。我已经三年没有接触过Rails或Ruby了,所以我对这两个都很生疏,加上我最后一次使用Rails是Rails2.3。不用说,请原谅下面的任何“简单”问题 这是规格Ruby on rails Rails资源管道中的动态CSS,动态编译,ruby-on-rails,ruby,ruby-on-rails-3.2,less,asset-pipeline,Ruby On Rails,Ruby,Ruby On Rails 3.2,Less,Asset Pipeline,我正在Rails 3.2中构建一个站点。我已经三年没有接触过Rails或Ruby了,所以我对这两个都很生疏,加上我最后一次使用Rails是Rails2.3。不用说,请原谅下面的任何“简单”问题 这是规格 多坦能CMS/商店站点 等等 每个“商店”(又名子域)都可以通过CSS定制拥有自己的外观、感觉等 可以在应用程序内的UI中执行自定义,允许用户更改引导的基本变量(即@textColor,@bodyBackground等) 我正在使用lessrails引导程序gem来实现Twitte
- 多坦能CMS/商店站点
- 等等
- 每个“商店”(又名子域)都可以通过CSS定制拥有自己的外观、感觉等
- 可以在应用程序内的UI中执行自定义,允许用户更改引导的基本变量(即
,@textColor
等)@bodyBackground
- 可以在应用程序内的UI中执行自定义,允许用户更改引导的基本变量(即
- 我正在使用
lessrails引导程序
gem来实现Twitter引导程序的外观/感觉,等等
less
)谢谢 以下是我最终找到的解决方案:
- 我最终切换到
引导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
- 使用了德国克劳特计算公司的曼努埃尔·缪尔(Manuel Meure)(谢谢曼努埃尔!)提供的概念
-
我做了一些调整,以适应我自己的需要,但曼努埃尔的核心概念是我编译过程的基础。
# .../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
#…/app/models/site.rb
...
基本样式=”
@导入“指南针/css3”;
@导入“引导”;
@导入“引导响应”;
“.别动
#提供将
#在编译之前,请将其包含在基本SASS内容中
def sass_内容
"
$bodyBackground:#{self.body_background};
$textColor:#{self.text_color};
“+self.css#您想添加的任何其他css/SASS
结束
def compile_css(仅测试=false,强制重新编译=false)
#SassCompiler是对Kraut计算链接提供的信息的修改
compiler=SassCompiler.new(“#{self.id}/site.css”,{:syntax=>:scss,:output_dir=>Rails.root.join('app','assets','sites'))
#如果我们已经编译了,并且没有强制重新编译,就可以保释
返回compiler.compiled?&&!强制重新编译&!仅测试
#这里的块产生将被呈现的内容
compiler.compile(仅限测试){
#以我们的基本样式为例,添加一些我们提供的变量,供用户自定义
#然后最后添加我们的css/SCS,用户更新了这些内容,并将其用作
#我们的原始sass需要编译
BASE_STYLE.gsub(/,self.sass_内容)
}
结束
谢谢 您可以添加像
这样的规则!重要信息
在动态添加的脚本中,用于更改内容。那么你就不必做所有这些重新编译了。这里的部分目标是能够利用CSS中变量的优势。这些变量在引导源文件中得到重用。例如变量@purple
。这允许用户指定我们要使用的“紫色”的颜色(色调/饱和度等)。然后在引导过程中的多个位置使用。很遗憾,常规CSS在这里不起作用。Ryan,我正在寻找与您相同的答案,因为我想利用引导变量。当然,它在开发中起作用,因为事情是动态编译的。我正在做一些类似的事情,将客户的较少文件保存在lib/assets/stylesheets/customers中。然后在我的application.html.erb文件中,我检查站点是否通过子域访问,然后提供相应的文件(我在子域后命名.less文件)。你搞清楚了吗?如果没有,我会在你的问题上添加我自己的观点,这样我就不会重复了。我很好奇你是否知道我如何将此部署到Heroku,因为他们坚持所有部署都必须是initialize\u on\u precompile=false
@Trip,希望我能为你提供一个好的答案。这是一个有点,因为我一直在Rails的土地,不能回忆起如果我遇到了这件事-对不起。如果您觉得可以在此基础上进行扩展,请随意编辑我的答案。啊,我确实找到了一个答案,可以将其设置为true进行部署,您只需使用Heroku的默认构建包。。从技术上讲,默认情况下应该运行。我的错误是两年前,同一个应用程序有一个定制的,一些开发者正在修补它,而我没有更新它