Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Railsの技: ナビゲーションリンクで便利なlink_to_unless_currentメソッド(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

Railsの技: ナビゲーションリンクで便利なlink_to_unless_currentメソッド(翻訳)

Railsの古典的なlink_toヘルパーメソッドは皆さんもとっくにお馴染みでしょう。しかしlink_to_unless_currentという変種はご存知ですか?

link_to_unless_currentメソッドの動作は、「リンク先がブラウザの現在のURLと同じ場合はリンクを生成しない」「それ以外の場合はlink_toと同じ」です。

使い方

link_tolink_to_unless_currentに置き換えるだけで完了です。そのページを表示していない場合は<a>タグをレンダリングし、そのページを表示している場合はリンクテキストだけをレンダリングします。

<nav class="flex flex-col space-y-1">
  <%= link_to_unless_current "Dashboard", dashboard_path %>
  <%= link_to_unless_current "Team", teams_path %>
  <%= link_to_unless_current "Projects", projects_path %>
  ...
</nav>

/dashboardを開いている場合は、上のテンプレートから以下のHTMLが生成されます。

<nav class="flex flex-col space-y-1">
  Dashboard
  <a href="/teams">Teams</a>
  <a href="/projects">Projects</a>
  ...
</nav>

リンク名の代わりにブロックを渡してレンダリングすることもできます。これは共有ビューを作成するときに重宝します。たとえば、Postのアクションを持つ以下のようなパーシャルを作成できます。

<%= link_to_unless_current "+ Comment", new_comment_path do
  link_to "Back", posts_path
end %>

類似のヘルパーメソッド

ご想像のとおり、link_to_iflink_to_unlessといった類似のヘルパーメソッドを使えばリンクを生成するかどうかの条件を指定できます。

以下のように「通常はPostのリストをすべて表示する」「ただしadminとしてログインしている場合はリストのタイトルをeditページへのリンクに変える」ことも可能です。

<% @posts.each do |post| %>
  <%= link_to_if @user.admin?, post.title, manage_post_path(post) %>
<% end %>

参考資料

関連記事

Railsの技: pluckはActive RecordモデルでもEnumerableでも使える(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。