13
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ソニックガーデン プログラマAdvent Calendar 2024

Day 3

長ったらしいマークアップは Helper に押し込んで View をスッキリさせよう

Posted at

この記事はソニックガーデン プログラマ アドベントカレンダーの3日目の記事です。


Rails の Helper に関する小ネタです。タイトルの通り、長ったらしいマークアップを Helper に押し込むことで、View をスッキリさせようという話です。

Stimulus を使っていると長ったらしいマークアップを要求されることがままあります。
例えばこんな Stimulus コントローラがあるとします:

application.register('class-toggle', class extends Controller {
  static targets = ['element']
  static values = { className: String }

  toggle(ev) {
    for (const el of this.elementTargets) {
      el.classList.remove(this.classNameValue)
    }

    const { currentTarget } = ev
    currentTarget.classList.add(this.classNameValue)
  }
})

これを使うマークアップは、べたっと書くとこうなる想定です。

%div{ data: { controller: 'class-toggle', class_toggle_class_name_value: 'active' } }
  %button{ data: { class_toggle_target: 'element', action: 'class-toggle#toggle' } }%button{ data: { class_toggle_target: 'element', action: 'class-toggle#toggle' } }%button{ data: { class_toggle_target: 'element', action: 'class-toggle#toggle' } }%button{ data: { class_toggle_target: 'element', action: 'class-toggle#toggle' } }%button{ data: { class_toggle_target: 'element', action: 'class-toggle#toggle' } }%button{ data: { class_toggle_target: 'element', action: 'class-toggle#toggle' } }%button{ data: { class_toggle_target: 'element', action: 'class-toggle#toggle' } }

長ったらしいですよね。プロダクションコードではもっとたくさんの属性を指定するケースも珍しくありません。

そこで Helper です。

module ButtonToggleHelper
  def toggleable_button_tag(label)
    tag.button(label, data: { class_toggle_target: 'element', action: 'class-toggle#toggle' })
  end
end

このヘルパーメソッドを使うと、マークアップは以下のようにスッキリします。

%div{ data: { controller: 'class-toggle', class_toggle_class_name_value: 'active' } }
  = toggleable_button_tag '赤'
  = toggleable_button_tag '橙'
  = toggleable_button_tag '黃'
  = toggleable_button_tag '緑'
  = toggleable_button_tag '青'
  = toggleable_button_tag '藍'
  = toggleable_button_tag '紫'

単にスッキリしただけでなく、マークアップが DRY になったので、Stimulus コントローラ側に修正が入っても、マークアップの修正を最小限に抑えることができます。

今回は長ったらしいマークアップを求められる状況の例として Stimulus を引き合いに出しましたが、他にも例えば TailwindCSS なんかも同じような状況になりがちかなと思います。Stimulus 以外にも応用できるノウハウだと思っています。

というわけで、Helper を有効活用することで、View をスッキリさせていこうというお話でした。


4日目は @kontikun です。お楽しみに!

13
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?