質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

1877閲覧

コントローラー毎にCSSを使い分けたい

naserehari

総合スコア35

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

1グッド

2クリップ

投稿2020/07/20 10:00

Rails 6.0.2.2 を使っています。
assets を使ってコントローラ毎に css を使い分けていて以下のようにうまく機能していました。

app/view/layouts/application.html.erb

erb

1<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> 2<%= stylesheet_link_tag params[:controller], media: 'all', 'data-turbolinks-track': 'reload' unless devise_controller? %>
  • app/assets/stylesheets/<コントローラ名に対応した名前>.scss が存在する
  • application.scss では require_tree . は使っていない

これを webpacker 側に寄せたく、以下のように *_pack_tag を使うようにしました。
scss ファイルも app/javascript/stylesheets/ 配下にコピーしました。
application.scss のスタイルは効くようになったのですが、コントローラ毎のスタイルが効いていません。
どうしたらよいでしょうか?

現状では以下のようになっています。

  • config/webpack/environment.js

js

1const { environment } = require('@rails/webpacker') 2 3const webpack = require('webpack') 4environment.plugins.prepend( 5 'Provide', 6 new webpack.ProvidePlugin({ 7 $: 'jquery/src/jquery', 8 jQuery: 'jquery/src/jquery', 9 jquery: 'jquery/src/jquery', 10 Popper: 'popper.js' 11 }) 12) 13 14module.exports = environment
  • app/javascript/packs/application.js

js

1import 'bootstrap' 2import '../stylesheets/application' 3 4require("@rails/ujs").start() 5require("turbolinks").start() 6require("@rails/activestorage").start() 7require("channels") 8require("trix") 9require("@rails/actiontext")

上記の 2行目で scss を読み込んでいると思うのですが、3行目あたりに

import '../stylesheets/コントローラ名1' import '../stylesheets/コントローラ名2' . .

のように列挙しても CSS が混ざってしまいますよね!?

ikore908👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

特に設定を変更していなければ、
packs以下に<コントローラ名に対応した名前>.jsを用意して、scssをimportする。
stylesheet_pack_tag <コントローラ名に対応した名前> で読み込みができると思います。

拡張子が必要かもしれませんので、うまくいかなければ適宜つけてください。

users_controllerに適したassetsを読み込む場合。

js

1# packs/users.js 2import 'stylesheets/user.scss'

erb

1<%= stylesheet_pack_tag <コントローラ名に対応した名前>, オプション %>

投稿2020/07/20 13:32

Cojiro

総合スコア539

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

naserehari

2020/07/20 23:23

やってみたのですが、うまく動きませんでした。 どうやら packs/users.js が読み込まれていない... 色々と調べながらいじってみると `stylesheet_pack_tag` ではなく、 `javascript_pack_tag` でうまくいきました。 users.js が JS だからかな... あと、細かいですが - 拡張子は無しで行けました - ご指摘の例では `user.scss` となっていますが、これは `users.scss` の TYPO と解釈しました
Cojiro

2020/07/20 23:45

> - 拡張子は無しで行けました よかったです。 > ・ご指摘の例では `user.scss` となっていますが、これは `users.scss` の TYPO と解釈しました 失礼しました。 > どうやら packs/users.js が読み込まれていない... どのように判断されましたか?
Cojiro

2020/07/21 01:18

フォルダ構成を提示していただけますか?
naserehari

2020/07/21 08:47 編集

>> どうやら packs/users.js が読み込まれていない... >どのように判断されましたか? packs/users.js に `console.log("hoge")` のデバッグ文を入れました。同時に packs/application.js 内には `console.log("fuga")` を入れたのですが、後者のみ出力されました。 フォルダ構成は以下の通りです(実際のソースです) ``` % tree app/javascript app/javascript ├── channels │   ├── consumer.js │   └── index.js ├── packs │   ├── application.js │   └── companies.js └── stylesheets   ├── application.scss   ├── companies.scss  └── welcome.scss % cat app/javascript/packs/companies.js import '../stylesheets/companies'; % ```
Cojiro

2020/07/21 08:13

なるほど。その確認方法だと、stylesheets_pack_tagの読み込みだけだとすると、ビルドするときにscssが読み込めていたとしても、hogeは出力できないですね。 ビルドされたcssファイルの中身をブラウザ等から確認して、指定した要素がある確認するのが確実かと思います。 パスの指定の仕方が誤っている可能性があるので、確認したいのですが、 ・今回読み込みたいのはcompaniesですか? ・application.scss, companies.scss, welcome.scssはstylesheets/ですか?
naserehari

2020/07/21 08:47

はい。 companies です。 *scss は app/javascript/stylesheets 配下にあります(teratail側が等幅フォントで正しく表示できていないみたいです) なるほど hoge は出力されないのか。 でも css は反映されていないです(確認済み) 今、疑ってるのは https://www.rubydoc.info/github/rails/webpacker/Webpacker%2FHelper:stylesheet_pack_tag によると、 development モードではこのメソッドが機能しない(!?)のでは。って感じです (英語含めよくわかっていない...)
naserehari

2020/07/21 08:48

> *scss は app/javascript/stylesheets 配下にあります(teratail側が等幅フォントで正しく表示できていないみたいです) たった今、 tree の出力結果に全角スペースをいれて見た目を調整しました。
Cojiro

2020/07/21 10:16

ありがとうございます。 忘れていましたが、もしかしたら、 webpacker.ymlのextract_cssがfalseになっていませんか? もしそうだとしたらtrueにして、サーバーを再起動して読み込みをしてみてください。
naserehari

2020/07/23 03:49

> webpacker.ymlのextract_cssがfalseになっていませんか? false になっていました。 true にすると期待通りになりました! ありがとうございます。 (少し理解が進んだのですが、全体的にわかっていない部分が多いことに気づけました...もっと勉強します)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問