1

戦争として展開されるRails(アセットパイプラインを備えた3.1.3)アプリケーションがあります。このアプリケーションには、UIの「テーマ」があります。内部的には、Railsアプリケーションのアセットディレクトリに.scssファイル(Sass)があり、ユーザーがそれらを切り替えることができます。

戦争として展開された後、管理者がテーマ(基本的には.scssファイル)をアプリケーションに追加できるようにしたいと思います。戦争を再構築/再コンパイルせずに(warblerを使用して)機能を許可するにはどうすればよいですか?理想的には、warファイルで何もしなくてもテーマを追加できるはずです。

言語ファイルについても同様の懸念があります。デプロイされたRailsアプリケーションに言語ファイルを動的に追加するにはどうすればよいですか?

私は現在、アセット、つまりSassを使用して作成されたテーマを本番環境でプリコンパイルしていますが、この問題の解決に役立つ場合は、これを変更することもできます。戦争以外でアセットをプリコンパイルできますか?資産パイプラインの経路を戦争の外に設定することは可能ですか?

4

3 に答える 3

1

これが私の頭に浮かぶことです。

いくつかのtomcat-apache-httpdコンボを使用している必要があります

私の推測は、ファイルをプリコンパイルし、apacheに静的コンテンツを提供させることであり、warに追加しないでください。

ファイルのコンテンツを変更する必要があると感じたら、再度最新のコンテンツでプリコンパイルし、サーバー上で置き換えます。戦争を再展開する必要はありません

Apacheから静的コンテンツを提供し、他の呼び出しをtomcatに送信するには、サーバー構成を行う必要があります。

/assetsアセットをプリコンプリートし、パブリックアセットディレクトリをコピーして別の場所に保存し、そのディレクトリからすべてのサーバーにapacheを構成します

mod_jkapacheから静的アセットを提供するように構成する方法を確認してください

http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html静的Webアプリケーションファイルを提供するためのApacheの設定セクションを 確認してください

を使用してproxypass

https://serverfault.com/questions/379667/apache-proxypass-ignore-static-files

https://serverfault.com/questions/156391/what-is-an-ideal-apache-tomcat-setup-with-apache-serving-static-assets

https://www.apachelounge.com/viewtopic.php?t=3907

言語ファイルがアセットの外部にある場合は、@pitoが提案したようにデータベースを使用してみてください。

または、同じキャッシュ手法を使用して、別のサーバーからファイルを呼び出し、管理者がファイルを更新する必要がある場合はファイルキャッシュを再ロードすることにより、ファイル全体をキャッシュすることもできます。

コードを変更するには、戦争の再コンパイルが必要になります。

戦争が抽出された後、WEPAPPSで抽出されたディレクトリにファイル変更ファイルを直接追加してtomcatを再起動できますが、これは実稼働環境にとってリスクが高すぎると思います。

私はそれをしていませんが、確かにうまくいくはずだと思います。

于 2012-08-15T22:26:57.783 に答える
1

Warblerについて読むと、簡単な回避策はないようです。データベースを介してアプリに新しいテーマと言語を提供させます

于 2012-08-21T19:52:39.353 に答える
1

免責事項:私はWARにまったく精通していません。私はそれを経験したことがないので、私の答えは完全に間違っているかもしれません。これは興味深い課題であり、解決策を見つけたかったことを理解してください。

WARアーカイブを作成するときに、アプリケーションが何を実行できるかわかりません。その結果、実際のコンパイルを行うためにコマンドラインを使用することにしました。ただし、 sass gemを含めて、必要に応じてコンパイラーを直接使用することはそれほど難しくありません。

私はコマンドラインに依存しているので、sassgemをインストールする必要があります。次に、コマンドラインインターフェイスの使用に関するREADMEを参照してください。

テストのためにTheme、次の列で呼ばれるモデルを作成しました。使用しているモデルに一致するように、以下のコードを変更する必要がある場合があります。

  1. (string) title # the title of the theme
  2. (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>
于 2012-08-25T04:25:00.803 に答える