###やりたいこと
Rails で動いているシステムに bootstrap ベースのテンプレートやテーマをいろいろあててデザインをみたい
###問題点
たとえば
<h2 class=".....">ラベル</h2> <p class=".....">コンテンツ</p>
みたいなアコーディオンやカードといったよく使う部品のレイアウトを調整したくて
コンテンツのクラスに p-1 を追加したいみたいなときに
あちこちの view にちらばってる部品を使ってる場所全部に p-1 を追加して回らなければならない
表示してみてやっぱり px-2 px-1 にしようとかなったらまた書き直し
→ なるべく同じ部品のクラスを1回の記述でまとめてレイアウト調整できるようにしたい
###ためしたこと
HTML には最低限のクラスのみをつけて
SCSS でセレクタを使って bootstrap のクラスを extend して適用する
<div class="acc"> <h2></h2> <p></p> </div> .acc > p { @extend .p-1 }
→ @extend で bootstrap クラスを指定するには @import bootstrap を全部の部品でかかなければいけなくて
全部の部品の CSS に bootstrap の中身が展開されて肥大化する
https://teratail.com/questions/142621
で質問して結局 HTML に bootstrap のクラスをつけるしかないという結論に
→ Rails 側でなるべく共通の部品をサブルーチン化してクラス指定をまとめたい
####方法1 パーシャルレイアウトを使う
partial layout を使って _acc.html.erb に
erb
1<h2 class="...", href="#<%=id%>"><%= yield :head %></h2> 2<p class="..." id="<%=id%>"<%= yield %></p>
と名前付き yield でブロックを展開しようとしても
erb
1<%= render layout: ’acc’ do %> 2content_for :head do 3ラベル 4end 5コンテンツ 6end
を複数回よぶと名前付きの方だけなぜか記述が重複して表示されてしまう
####方法2 メソッドを使う
https://teratail.com/questions/143292
ここでメソッド化する書き方を教えていただいたのですが
def acc(&block1, &block2)
のように複数のブロックを引数にとれないらしくどうしたらいいか困っています
Rails ではブロック複数をうけとって複数回呼び出せるサブルーチンを作るのは不可能なのでしょうか
####妥協案1 クラス名だけ変数をつかう
@acc_label_class=... @acc_contents_class=...
と定義してアコーディオンの部品に毎回
<h2 class="<%=@acc_label_class%>" <p class="<%=@acc_contents_class%>"
とかく
####妥協案2 サブルーチンのコードをブロックごとにわける
def acc_label(&block) def acc_contents(&block)
というのを考えていますがどうするのがきれいな書き方なのでしょうか
あなたの回答
tips
プレビュー