RichComponentHelper#tab_links

trac が落ちていて忘れそうなのでこちらにメモ。


以前から地味に存在していたメソッドだけれども。Widget の周りに配置可能なタブボタン用のヘルパーで、クリックするとウィジェットの内容設定したURIからロードしたコンテンツに書き換えるやつ。

コントローラー内で @tab_links というインスタンス変数に[ラベル名, URI(, html_options)]の配列を入れておくと、自動的にタブが現れる。

  def load_tab_links
    @tab_links = []
    if login?
      @tab_links << [_("My subscriptions"),        feed_subscriptions_path(:user_id => current_user.login_name)]
      @tab_links << [_("Recent Items"),            recents_feed_subscriptions_path(:user_id => current_user.login_name)]
      @tab_links << [_("Add my new subscription"), new_feed_subscription_path(:user_id => current_user.login_name)]
    end
  end

現時点では、ウィジェットのboxの下側にタブボタンが配置されるけれども、将来的には上下左右のいずれかから選べるようにしたい、とか。

仕組みは簡単で、あらかじめtab用のplaceholderを用意しておき、@tab_links が設定されている場合にJavaScriptをはき出してボタンを生成させているだけ(なので上述の例の場合は、ログインしていないとタブは表示されない)。request.path とリンクするURIのパスが一致する場合は class="current" が自動付与されるようにもしています。
SpinelzのtabBox のlazyLoadでもいいんだけれど、too match だったので(画像とかをあわせるのが面倒だった、とも)さくっとのJavaScriptと少々のスタイルシートで実装。

という準備運動をしてから実装を再開しました。GW中にがんばりたい。