Rails link_to_if and link_to_unless

Rails is packed with nifty, small helpers that help you not reinvent the wheel. Every once in a while you remember one that you are sure some of you are not known with.

Today and I want to quickly go over: link_to_if and link_to_unless.

They both act the same as the, probably, known link_to helper, but, as you guessed, allow a conditional.

Basics

The syntax for link_to_if looks like this:

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

Or with actual values:

<%= link_to_if(Current.user.present?, "Profile", profile_path) %>

This will, if Current.user.present? returns true, render a typical link_to, but if it returns false it will return just the text Profile.

link_to_unless accepts the same attributes, but does the opposite. Take this example:

<%= link_to_unless(current_page?(home_path), "Home", home_path) %>

This will render a typical link_to unless current_page?(home_path) returns true. You can imagine this is useful in navigations.

Tweak the conditional render

You can also tweak what (if anything) is rendered when the conditional is (not) met. Like so:

<%= link_to_if(Current.user.has_role?(:admin), "Manage Users", admin_users_path) do %>
  <div>
    <p>You need to be an admin to manage users.</p>

    <p>If you believe this is an error, please contact support.</p>
  </div>
<% end %>

I have used this to show links to features a certain account/user didn’t have access to, but then show a modal for an upsell. Works great.

<%= link_to_if(Feature.enabled?(:ai_access), "Add AI Magic", setting_ai_path) do %>
  <%= link_to "Add AI Magic", upsell_path(highlight: "ai"), data: {turbo_frame: "modal"} %>
<% end %>

And that’s it. Yet another small, but useful little helper in Rails.

Get UI & Product Engineering Insights for Rails Apps (and product updates!)

Published at . Have suggestions or improvements on this content? Do reach out.

UI components Library for Ruby on Rails apps

$ 99 one-time
payment

Get Access
  • One-time Payment

  • Access to the Entire Library

  • Built using ViewComponent

  • Designed with Tailwind CSS

  • Enhanced with Hotwire