0

Rails 3 アセット パイプラインを使用するために移行したいレガシー アプリケーションがあります。を使用してテンプレートごとにテンプレートにインポートされる 100 以上のスタイルシートがあります。

content_for :stylesheets

ブロック。

それらすべてを単一のスタイルシートにコンパイルすることは、コードが特定のページで特定のスタイルシートのみを想定するように記述されているため、現時点ではうまくいきません。たとえば、ログイン ページは、article formを再定義するスタイルシートをインポートします。これをすべてのページで再定義するのは良くありません。

アセット パイプラインにゆっくりと移行し、アプリが最初にコンパイル済みのアセットを探してから、 public/stylesheetsディレクトリにフェールオーバーする方法はありますか?

4

1 に答える 1

1

これを「正しく」実行したい場合、<html>または<body>タグにクラス名を付けて、CSS ファイルの内容をセレクターでラップすることは、それほど手間がかからない方法の 1 つです。たとえば、私は次のようなものを私のApplicationController.

before_filter :body_class

def body_class
  controller_name = self.class.name.gsub(/Controller$/, '')
  if !controller_name.index('::').nil?
    namespace, controller_name = controller_name.split('::')
  end

  @body_classes = ["#{controller_name.underscore}_#{action_name} ".downcase.strip]
  @body_classes = ["#{namespace.underscore}_#{@default_body_classes.join}".strip] if !namespace.nil?
end

次に、私のレイアウトでは、これに似たものがあります

<body class="<%= @default_body_classes.join(' ') %>">

次に、すべてのスタイルシートの拡張子を.css.scss. それらをすべて新しいapp/assets/stylesheetsディレクトリに配置します。それらをすばやく含めるには(順序が間違っている可能性がありますが)、追加します

/*
 * =require_tree .
 */

新しいapp/assets/application.css.scssファイルの先頭に。この 1 つのapplication.cssファイルをレイアウトに含めるだけです。

<%= stylesheet_link_tag "application", :media => 'screen' %>

最後に、スタイルシートを調べて、各ドキュメント全体を適切なボディ クラスでラップします。たとえば、User::Adminコントローラーのsignupアクションに固有のスタイルシートがある場合、そのスタイルシート全体を次のようにラップします。

.user_admin.signup {
  /* Your stylesheet's content here */
}

Sass は、ネストされたすべてのコンテンツに、そのアクションがレンダリングされるときにタグに.user_admin.signup追加されるクラスを適切にプレフィックスとして付けます。<body>

あなたが探しているように、これは実際には中間的な修正ではないことを理解していますが、これと同様の手順に従うと、それほど努力せずに95%の方法を達成できるはずであり、「正しく」行われます.

于 2012-11-02T11:26:02.937 に答える