

Rails で次のようなtableの表を作成する際、いつもif文を用いて実装しております。  
※ slimで記載しております

categories/index.html.slim

[code]

    - if store.categorys.present?
      - store.categorys.each do |category|
          tr
            td = category.id
            td = category.name
            td = link_to '編集', new_store_category_path(store.id)
    - else
      td
      td
      td = link_to '新規作成', new_store_category_path(store.id)
    
[/code]

これで意図した表は作成できており、今回のようにtdの数が少ない時はいいのですが、tdの数が10個近くあるようなtableを作成する場合、可読性がかなり悪くなります。

これを何とかリファクタリングしたいと思い調べたところ、content_tagを用いたヘルパーを使えば実現できるのかもしれないというところまでわかり、content_tagを用いたサンプルコードなどを用いて色々と試しておりました。

しかし、上手くいかず、困っております。

目的としては、複数箇所でこういったif文での分岐で、使いわけるtableのリファクタリングです。よろしくお願いします。


CC BY-SA 4.0
2016-05-18T16:17:40.713
24980
2023-11-17T19:03:10.397
2022-11-22T00:08:53.677
3060
13175
question
ruby-on-rails ruby
次のようなtableをcontent_tagを用いてhelperとして作成したい


コメントではコードが書けないので、回答側で失礼しますが、質問です。  
リファクタリングしたい、ということですが、範囲が広く求めているゴールが分かりませんでした。  
問題意識が下記であれば、繰り返しを使って、まとめれば良いのではないかしら？と思います。

> tdの数が10個近くあるようなtableを作成する場合、可読性がかなりわるくなります。
[code]

    - if store.categorys.present?
      - store.categorys.each do |category|
        tr
          td = category.id
          td = category.name
          td = link_to '編集', new_store_category_path(store.id)
    - else
      - 2.times.each do 
        td
      td = link_to '新規作成', new_store_category_path(store.id)
    
[/code]

2つなので、`2.times`ですが、10個なら、`10.times`が使えると思います。  
この問題だけでしたら、シンプルに回答できてしまいますので、より具体的なイメージ、擬似コードなどを追加していただけないでしょうか？


CC BY-SA 3.0
2016-05-18T22:13:03.637
24982
2016-05-18T22:13:03.637
7471
24980
answer


helper を用意しなくても次のように String の乗算演算子を使って簡潔に記述できます。

[code]

    - if store.categorys.present?
      - store.categorys.each do |category|
          tr
            td = category.id
            td = category.name
            td = link_to '編集', new_store_category_path(store.id)
    - else
      == content_tag(:td) * 2
      td = link_to '新規作成', new_store_category_path(store.id)
    
[/code]

繰り返す数は掛ける数（上記では 2 ）を変えるだけです。  
ただし、slim の `==` 表記（rawヘルパーと同等）を使っていることに注意してください。

もしどうしてもヘルパー化したい場合は、そのままメソッド化することもできます。

helpers/table_helper.rb

[code]

    module TableHelper
      def empty_td(count=1)
        raw(content_tag(:td) * count)
      end
    end
    
[/code]

views/categories/index.html.slim

[code]

    - if store.categorys.present?
      - store.categorys.each do |category|
          tr
            td = category.id
            td = category.name
            td = link_to '編集', new_store_category_path(store.id)
    - else
      = empty_td(2)
      td = link_to '新規作成', new_store_category_path(store.id)
    
[/code]


CC BY-SA 3.0
2017-02-13T16:29:58.580
32644
2017-02-13T16:29:58.580
19925
24980
answer