これは以前にいくつかの人が尋ねた質問ですが、質問のどれもが私が役立つと思う方法で完全に質問または回答されたものではなかったため、私は役立つと思われる質問と回答を書いています。
Rails 3.1+アプリをアセットパイプラインを使用しています。異なるCSSを使用したい特定のアクションが1つあります(私の特定のケースでは、印刷用のページがあります) 、完全に異なるCSSが必要であり、Javascriptは必要ありません。)現在、アプリケーション固有のCSSファイルは1つしかありません。新しいCSSファイルを追加して、アセットパイプラインに自分のファイルを使用するように指示するにはどうすればよいですか?
たとえば、現在、app/assets
は次のようになっています
app/assets
/javascript
application.js
custom.js.coffee
/css
application.css
custom.css.scss
特定のアクションのビューで使用されるprint.css
ファイルを追加したい。このビューはapplication.css
ファイルを使用しません。 print.css
を追加するにはどうすればよいですか?
私はこのブログ投稿が非常に役立つことがわかりました: http://blog.seancarpenter.net/2012/11/05/page-specific-javascript-with-the-asset-pipeline/ 。私の答えは、このブロガーがすでに書いたものを言い換え、いくつかの不足している詳細を記入します。
まず、 the Rails Asset Pipeline to the Asset Pipeline を読んで理解しておくことが重要です。残念ながら、このガイドではアクション固有のアセットを追加する方法を明確に説明していませんが、知っておく必要があるいくつかの概念をカバーしています。これらのアイデアを理解していることを確認してください:
require
、require_tree
、require_self
などのコマンドを使用して、一緒にコンパイルされるファイルを示します。rake assets:precompile
を手動で実行して、public
ディレクトリにコンパイル済みの縮小されたアセットを作成する必要があります。これらのアイデアは、資産パイプラインに関する最小限の「知る必要のある」情報です。これらのアイデアをまだ理解していない場合は、パイプラインに関する「エキスパートまたはマニア」レベルの知識がなく、残念ながらSOはこのことを学ぶのに適した場所ではありません。さいわい、 the Railsアセットパイプラインのガイド は15分の短い読み取りであり、必要に応じてすばやく習得できます。
次に、これらは、アセットパイプラインが新しいprint.css
ファイルを正しく認識して処理するようにするために必要な変更です。
次の手順を実行します:
print.css
ファイルをapp/assets/css
に追加します。print.css
の場所をRailsに示すマニフェストファイルを作成する必要があります。追加するCSSファイルは1つだけですが、これを行う必要があります。これは簡単なステップです。print.js
というファイルをapp/assets/javascript
に追加します。print.js
に追加します。// =印刷が必要
これは、print.js
ファイル全体の唯一の行になります。私が正しく理解している場合、Railsはマニフェストファイルのファイル拡張子が.js
であると想定しているため、print.css
をマニフェストファイルとして使用していません。
print.js
マニフェストを見つけて使用するように指示する必要があります。 config/application.rb
ファイルに次の行を追加します。config.assets.precompile + =%w(print.js)
application.js
マニフェストには//= require_tree .
という行が含まれています。つまり、print.css
ファイルが含まれます。これにより、print.css
スタイルが、単一のビューだけでなくサイト全体に影響します。これに対処するには2つの方法があります。application.js
とprint.js
がアセットを共有しない場合は、application.js
でstub
コマンドを使用して、print.js
で使用されているアセットを除外できます。これが行うことは、application.js
がprint.js
が参照するアセットを参照ファイルの独自のリストから削除するように指示することです。変更されたapplication.js
は次のようになります。(snip ...) require_tree。 stub print
詳細は this answer を参照してください。
print.js
ファイルとapplication.js
ファイルがいくつかのアセットを共有している場合は、application.js
が使用するすべてのアセットをサブディレクトリに移動する必要があります。私はこれを自分でしなかったので、私はこの分野でほとんど助けにはなりませんでした。手順については この答え を参照してください。これで、アセットパイプラインにprint.css
が含まれました。特定のビューでprint.css
を使用するようにRailsに指示する必要があります。
アクションがreports
コントローラーにあり、アクションの名前がprint_reports
であるとします。これは、reports_controller.rb
ファイルとprint_reports.html.erb
(または.haml
)ファイルがあることを意味します。これらのファイルにいくつかの変更を加える必要があります。
app/views/layouts
に新しいレイアウトを追加します。おそらくprint.html.erb
と呼んでください。この新しいレイアウトをprint_reports.html.erb
ファイルに使用します。必要に応じて設定してください。印刷を意図したページの場合、これは次のように非常に単純なものになるでしょう。<html> <head> <title = "Print"> </ head> <body> <%=利回り%> </ body> </ html>
別のレイアウトを使用すると、このレイアウトと他のアプリケーションで使用されるレイアウトを同期させることが難しいという欠点がありますが、アクションに別のCSSファイルを使用している場合は、レイアウトを同じにしたくない場合があります。 。
stylesheet_link_tag
を指すレイアウトのヘッダーにprint.css
を追加します。<html> <head> <title = "Print" /> <%= stylesheet_link_tag "print"%> </ head> <body> <%= yield%> </ body> </ html>
layout 'print', only: [:print_reports]
という行をコントローラーに追加します。class reports_controller <ApplicationController layout 'print'、only:[:print_reports] #snip
詳細といくつかの異なるアプローチについては この質問 を参照してください。
この時点で、アプリを実行すると、print_reports
アクションがprint.css
を正しく使用しているはずです。
サーバーにデプロイする前に、必ずrake assets:precompile
を実行してください。
皆さんは非常に複雑な答えを出しています。
1 app/assets/stylesheetsに移動します
2。拡張子が.cssのファイルを作成します
3。config/initializers/assets.rbに移動します
4。このコード行を挿入Rails.application.config.assets.precompile += %w( file.css )
5。file.css
を作成したファイルに置き換えます
6。html.erbファイルに移動します
7。<head>
、<%= stylesheet_link_tag "file" %>
に入力します
8。file
をファイル名に置き換えます(名前に拡張子なし)
ファイルをリンクしました。
これは公式に文書化されていますRailsガイドはこちら: http://guides.rubyonrails.org/asset_pipeline.html#controller-specific-assets
実際には、require_treeディレクティブ(application.cssおよびapplication.jsにあります)を省略して、これをテンプレートで使用できます。
コントローラ固有のJavaScriptの場合:
<%= javascript_include_tag params[:controller] %>
コントローラ固有のCSSの場合:
<%= stylesheet_link_tag params[:controller] %>
あなたのレイアウトで
<head>
// ...
<%= yield :stylesheets %>
</head>
あなたの見解では
<%= provide :stylesheets do %>
// your page-specific css
<% end %>
別のCSSを使用したい特定のアクションがあります。
ここにあなたが探しているものを達成するための代替方法があります:
/ views/layouts/application.html.rbのアプリ本体にコントローラー名とアクション名を追加します:
<body class="<%= controller_name %>-<%= action_name %>">
<%= yield %>
</body>
次に、.scssファイルで:
.controller_name-action_name {
// your css goes here
}
したがって、コントローラがstatic_pagesで、アクションがhomeの場合:
.static_pages-home {
// your css goes here
}
多田! CSSはその特定のアクションに対してのみ表示されます。