免责声明:我根本不熟悉 WAR。我的回答可能完全错误,因为我没有这方面的经验。请理解,我发现这是一个有趣的挑战,我想找到一个解决方案。
我不知道当您创建 WAR 存档时应用程序能够做什么。结果我决定使用命令行来进行实际的编译。但是,如果需要,包含sass gem并直接使用编译器应该不会太难。
因为我依赖命令行,所以你必须安装sass gem。然后查看使用命令行界面的README。
为了测试,我创建了一个名为Theme
以下列的模型。您可能需要更改下面的代码以匹配您现有的模型。
(string) title # the title of the theme
(string) stylesheet_file_name # the name of the file that is saved
在我的表单内部,我使用了不同的字段名称来防止重叠。
<%= f.form_field :styleheet %>
然后在我的控制器内部,我添加了代码来编译上传的 scss 文件并将其移动到公共目录中。
def create
if params[:theme].has_key?(:stylesheet)
# create a filename friendly version of the theme name
file_name = params[:theme][:stylesheet_file_name] = params[:theme][:title].parameterize
# where to copy the temporary uploaded file to. It is important that we get
# the original extension. The `sass` command uses the extension to determine how to compile the file
tmp_file = "#{Rails.root}/tmp/#{params[:theme][:stylesheet].original_filename}"
# move from /tmp path to within the Rails temp directory
`cp #{params[:theme][:stylesheet].tempfile.path} #{tmp_file}`
# create the theme's css file.
File.open("#{Rails.root}/public/stylesheets/#{file_name}.css", 'w') do |f|
# compile the .scss file via command line
parsed_theme = `sass #{tmp_file}`
# store the contents of the file
f.write(parsed_theme)
end
# remove the temporary file we created earlier
`rm #{tmp_file}`
# this key wasn't part of my AR model
params[:theme].delete("stylesheet")
end
# rest of action here ...
end
准备好 css 文件后,您可以layout/application.html.erb
使用以下内容将其包含在文件中。
<head>
<%= stylesheet_link_tag "/stylesheets/#{@current_theme.stylesheet_file_name}" %>
</head>