免責事項:私はWARにまったく精通していません。私はそれを経験したことがないので、私の答えは完全に間違っているかもしれません。これは興味深い課題であり、解決策を見つけたかったことを理解してください。
WARアーカイブを作成するときに、アプリケーションが何を実行できるかわかりません。その結果、実際のコンパイルを行うためにコマンドラインを使用することにしました。ただし、 sass gemを含めて、必要に応じてコンパイラーを直接使用することはそれほど難しくありません。
私はコマンドラインに依存しているので、sassgemをインストールする必要があります。次に、コマンドラインインターフェイスの使用に関する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>