59181


rails 5.2.3を使用しています。  
下記のようなhtmlを、decorator（active_decorator）から出力させようとしています。

[code]

    .badge.badge-info
      = hoge
      .badge.badge-warning= fuga
    
[/code]

しかし、下記のように書くと、hogeの部分が出力されません。

[code]

    tag.div(class: 'badge badge-info') do
      hoge
      tag.div fuga, class: 'badge badge-warning'
    end
    
[/code]

hogeの部分も出力させるには、どう書けば良いのでしょうか？

**実際のコード**

view

[code]

    = vacation.badge
    
[/code]

decorator

[code]

    module VacationDecorator
    
      def badge
        tag.div(class: 'badge badge-info') do
          off_type_i18n
          tag.div aasm_state_i18n, class: 'badge badge-warning'
        end
      end
    
[/code]

**出力されたhtml**

[code]

    <div class="badge badge-info"><div class="badge badge-warning">申請中</div></div>
    
[/code]

blockの中の２行を入れ替えると、今度は

[code]

    <div class="badge badge-info">忌引き休暇</div>
    
[/code]

となってしまいます。  
欲しいのは下記のhtmlです。

[code]

    <div class='badge badge-info'>
      忌引き休暇
      <div class='badge badge-warning'>申請中</div>
    </div>
    
[/code]


CC BY-SA 4.0
2019-09-20T05:05:12.953
59174
2019-09-20T09:33:47.207
35919
question
ruby-on-rails html
#tag のブロック内で、最後のタグしか出力されない

[code]

    (
    hoge +
    tag.div(fuga, class: 'badge badge-warning')
    ).html_safe
    
[/code]

slim と ruby ではそもそも処理系が違うので  
slim の中では羅列文字列がそのまま出力されるけど  
ruby の中では順番に実行されてるだけで  
結果として返るのは return のみ（省略された場合は最後の行の返り値）  
でそれを slim がレンダリングしてるに過ぎない

ruby 内で羅列した（返り値が文字列の）もの全部出力するには  
単純に ＋ か concat でつないで返り値に含めればいい  
タグとして認識させたい場合は最後に html_safe をつける

[code]

    [
      hoge,
      tag.div(fuga, class: 'badge badge-warning')
    ].join.html_safe
    
[/code]

とかやるとちょっとかっこいいかも


CC BY-SA 4.0
2019-09-20T09:33:47.207
59181
2019-09-20T09:33:47.207
59174
answer