4874


内容としましては、「Rails 4.0 環境において、 haml を用いた view のある部分を helper 化したいのですが、うまくいかない」です。

[code]

    %li{class: "#{current_page?(:root) ? : 'active' : ''}"}
      = link_to :root do
        = fa_icon 'home'
        ホーム
    %li{class: "#{current_page?(:blogs) ? : 'active' : ''}"}
      = link_to :blogs do
        = fa_icon 'book'
        記事
    
[/code]

`li` タグでリストしつつ、その配下にある `a` タグの path が `current_page` と同じだった場合は、 `active` という
`class` を `li` タグへ与えるのですが、この `li` タグ部分を全てヘルパーで表現したいです。

  * ヘルパーには、 path と block を与えたい（もしくは、font-awesome 用の引数と `a` タグの `title` 部分も）
  * つまり、以下のどちらかのようなイメージで使用したい 
[code]     = li_helper(:root) do

      = link_to :root do
        = fa_icon 'home'
        ホーム
    
[/code]

または

[code]     = li_helper(:root, 'home', 'ホーム')

    
[/code]

いずれも出力イメージは、 root ページで出力したとして、

[code]

    %li.active
      = link_to :root do
        = fa_icon 'home'
        ホーム
    
[/code]

となって欲しいです。

どのように helper を定義したら実現できるでしょうか。


CC BY-SA 3.0
2015-01-20T01:30:56.423
4872
2015-01-20T02:25:40.927
2015-01-20T02:25:40.927
4978
7570
question
ruby-on-rails haml
haml を用いたビューの一部を再利用できるように、 block を渡すようなヘルパーが作れないか


僕が実装するなら、`link_with_icon`と、`active_class`のような2つのヘルパーを作ると思います。

[code]

    %li{class: active_class(:root)}
      = link_with_icon 'ホーム', :root, icon: 'home'
    
[/code]

[code]

    module FooHelper
      def active_class(options)
        current_page?(options) ? 'active' : nil
      end
    
      def link_with_icon(name, path, icon:)
        link_to path do
          fa_icon icon, text: name
        end
      end
    end
    
[/code]


CC BY-SA 3.0
2015-01-20T01:59:26.193
4874
2015-01-20T01:59:26.193
2599
4872
answer


表題に沿って、ブロック渡す方法を紹介します。

ヘルパでこんな感じにして

[code]

    def li_helper(path, name, &block)
      content_tag :li,
                  link_to(path){ block.call() },
                  class: ('home' == name ? 'active' : '')
    end
    
[/code]

ビューでこう呼び出します。

[code]

    = li_helper(:root, 'home') do
      ホーム
    
[/code]

`block.call()` ではなく `yield` を使えば暗黙的パラメータも使えますし、 `block_given?`
を使えば、渡された時とそうでないときの分岐もできます( `link_to` の内部実装がそんな感じですね)

`content_tag` を `haml_tag` に置き換えることもできます。この場合呼び出し側が `=` でなく `-` になるようです。


CC BY-SA 3.0
2015-01-20T02:16:04.523
4875
2015-01-20T02:16:04.523
4933
4872
answer