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

Rails: 知っておくと便利なlink_to_ifとlink_to_unless(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

日本語タイトルは内容に即したものにしました。

参考: Rails API link_to_if -- ActionView::Helpers::UrlHelper
参考: Rails API link_to_unless -- ActionView::Helpers::UrlHelper

Rails: link_to_ifとlink_to_unlessは知っておくと便利(翻訳)

Railsには、車輪を再発明せずに済む便利で気の利いた小さなヘルパーがぎっしり詰まっています。皆さんも、「これ知らなかった!」というヘルパーに出会うことが時たまあるでしょう。

今回はlink_to_iflink_to_unlessを手短に紹介したいと思います。

どちらも皆さんご存知のlink_toヘルパーと同じように振る舞いますが、メソッド名からわかるように条件を指定できるのが特長です。

🔗 基本的な使い方

link_to_ifの構文は以下のような感じです。

link_to_if(condition, name, options = {}, html_options = {}, &block)

ビューで実際の値を渡すときは以下のような感じになります。

<%= link_to_if(Current.user.present?, "プロファイル", profile_path) %>

上のコードは、Current.user.present?trueを返す場合は通常のlink_toと同様にリンクを生成しますが、falseを返す場合は"プロファイル"というテキストだけを返します。

link_to_unlessにも同じ属性を渡せますが、以下の例のように条件を逆にできます。

<%= link_to_unless(current_page?(home_path), "ホーム", home_path) %>

こちらは、current_page?(home_path)trueを返さない場合は通常のlink_toと同様にリンクを生成します。ご想像どおり、これはナビゲーション用のリンク作成に有用です。

🔗 条件付きレンダリングを微調整する

条件が満たされない場合に表示したいものがある場合は、以下のようにブロックを渡すことでカスタマイズできます。

<%= link_to_if(Current.user.has_role?(:admin), "ユーザーを管理する", admin_users_path) do %>
  <div>
    <p>ユーザーを管理するには管理者としてログインする必要があります。</p>

    <p>これがエラーと思われる場合は、サポートまでご連絡ください。</p>
  </div>
<% end %>

私はこれを応用して、有料機能へのリンクをクリックしたときに、未購入のユーザーには購入を促すモーダルダイアログを表示するのに使ったことがあります。これは効果抜群でした。

<%= link_to_if(Feature.enabled?(:ai_access), "AIマジックを追加", setting_ai_path) do %>
  <%= link_to "AIマジックを追加", upsell_path(highlight: "ai"), data: {turbo_frame: "modal"} %>
<% end %>

以上でおしまいです。Railsに備わっている、ささやかながら便利なヘルパーを紹介いたしました。

関連記事

Rails: パーシャルでstrict `locals`マジックコメントを使うときの注意点(翻訳)

Rails: Tailwind CSSをカスタムフォームビルダーで使う(翻訳)


CONTACT

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