Rails: link_to_ifとlink_to_unlessは知っておくと便利(翻訳)
Railsには、車輪を再発明せずに済む便利で気の利いた小さなヘルパーがぎっしり詰まっています。皆さんも、「これ知らなかった!」というヘルパーに出会うことが時たまあるでしょう。
今回はlink_to_if
とlink_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 API
link_to_if
--ActionView::Helpers::UrlHelper
参考: Rails API
link_to_unless
--ActionView::Helpers::UrlHelper