「ねぇパパ、コントローラー名によって表示内容を分岐させる方法を教えて〜」

画面によってタイトルの表示方法を動的に変えたい場合ってどうすれば良いんだ?

と思ったらどうやらこんな書き方があるらしい。

<% if controller.controller_name == "static_pages" && controller.action_name == "top" %>

意味: 「もしコントローラの名前がstatic_pagesもしくはtopだった場合」

Railsドキュメントによると、controller_nameでコントローラの名前を取得できるらしい。

EntriesController.controller_name
# "entries"

実際にアプリのヘッダーを動的に変える時に使うことができる。下記のコードは、

「もしコントローラの名前がstatic_pagesもしくはtopだった場合」に<%else%>までを表示、もし違う場合はログインができていないということなので、<%else%>以下を表示することを意味している。

<header>
  <% if controller.controller_name == "static_pages" && controller.action_name == "top" %>
    <div class="container" id='header-layout'>
      <div class="row justify-content-between">
        <div class='col-2 d-flex' id='top-logo'>
          <div class='my-auto mr-2 title-logo'><%= image_tag 'logo.png', size:'30x30' %></div>
          <%= link_to "Optime", root_path, class: "logo" %>
        </div>
        <div class='col-5 search-at-header my-auto' id='js-search-at-header'>
          <%= render "search_form" %>
        </div>
        <% if logged_in? %>
          <ul class='col-5 header-content my-auto'>
            <li><%= link_to "Home", root_path, id:'js-header-home' %></li>
            <li><%= link_to "Other's Optime", optimes_path %></li>
            <li><%= link_to "My Optime", user_path(current_user) %></li>
            <li><%= link_to "Logout", :logout, method: :delete %></li>
          </ul>
        <% else %>
          <ul class='col-5 header-content my-auto'>
              <li><%= link_to "Home", root_path, id:'js-header-home' %></li>
              <li><%= link_to "Other's Optime", optimes_path %></li>
              <li><%= link_to "Sign Up", new_user_path, method: :get %></li>
              <li><%= link_to "Login", :login, method: :get %></li>
          </ul>
        <% end %>
      </div>
    </div>
<% else %>
    <div class="other ">
      <div class="container">
        <div class="row justify-content-between">
          <div class='col-2 d-flex'>
            <div class='my-auto mr-2 title-logo'><%= image_tag 'logo.png', size:'30x30' %></div>
            <%= link_to "Optime", root_path, class: "logo" %>
          </div>

          <div class='col-5 search-at-header my-auto'>
            <%= render "static_pages/search_form" %>
          </div>

          <% if logged_in? %>
            <ul class='col-5 header-content my-auto'>
            <li><%= link_to "Home", root_path, id:'js-header-home' %></li>
            <li><%= link_to "Other's Optime", optimes_path, id:'js-header-othersoptimes' %></li>
            <li><%= link_to "My Optime", user_path(current_user),id:'js-header-optimes' %></li>
            <li><%= link_to "Logout", :logout, method: :delete %></li>
            </ul>
          <% else %>
            <ul class='col-5 header-content my-auto'>
              <li><%= link_to "Home", root_path, id:'js-header-home'%></li>
              <li><%= link_to "Other's Optime", posts_path, id:'js-header-optimes'%></li>
              <li><%= link_to "Sign Up", new_user_path, method: :get, id:'js-header-signup'%></li>
              <li><%= link_to "Login", :login, method: :get,id: 'js-header-login' %></li>
            </ul>        
          <% end %>          
        </div>
      </div>
    </div>
  <% end %>
</header>

content_forを使って動的にタイトルを表示させたり、それこそcontroller_nameによってclassにactiveを付与させることで現在居るページ名の書かれたタブを灰色にしてみたりと、〇〇によって表示する〇〇を動的に変えることって心が躍る。

ユーザー体験の向上に少しでも貢献できるなら、動的に変更できる系の要素はどんどん取り入れていきたい。

controller_name | Railsドキュメント