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

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

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

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

Sass

Sassは、プログラミング風のコードでCSSを生成できるスタイルシート言語です。 scss ファイルを、変換(コンパイル)してCSSファイルを作成します。

Q&A

0回答

222閲覧

Rails で複数ブロックを受け取って複数回よべるサブルーチンって作れますか?

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

Sass

Sassは、プログラミング風のコードでCSSを生成できるスタイルシート言語です。 scss ファイルを、変換(コンパイル)してCSSファイルを作成します。

0グッド

0クリップ

投稿2018/08/30 09:54

編集2018/08/31 02:16

###やりたいこと

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)

というのを考えていますがどうするのがきれいな書き方なのでしょうか

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問