Help us understand the problem. What is going on with this article?

ActiveView の link_to_if をとにかく使う方法

link_to までは分かってる人向け。

link_to_if とは

ActiveView において、条件によってリンクにするかしないか分ける方法。

たとえば、 link_to_if を使わない場合

<% if user.active? %>
  <%= link_to user.name, user_path(user) %>
<% else %>
  <%= user.name %>
<% end %>

となるようなところを、

<%= link_to_if user.active?, user.name, user_path(user) %>

のように一発で書ける。

使う制約としては、条件が true だろうが false だろうが同じ文字列を表示したい(上記の例の場合には user.name )ということがありそう

ここで実装されている https://github.com/rails/rails/blob/v6.0.0/actionview/lib/action_view/helpers/url_helper.rb#L432-L442

link_to_if ... xxxx_path を使えないケース

たとえば user があるとき( nil じゃないとき)だけリンクを置きたいというときに、

<%= link_to_if user, user&.name, user_path(user) %>

と書くことはできない。なぜかというと link_to_if の引数である user_path が (link_to_if の条件よりも)先に評価されるので、

No route matches {:action=>"show", :controller=>"users", :id=>nil} missing required keys: [:id]

などの例外が出る

これをどうしても link_to_if で実現させるには

<%= link_to_if user, user&.name, controller: :users, action: :show, id: user.id %>

とすればよい。(普通に考えれば xxxx_path のほうが綺麗だし、無理に使う必要はないと思います)

link_to_if の第三引数は、最終的に ActionDispatch::Routing::UrlForfull_url_for で URL 化されます。 Hash のときは url_for 、既に String のときはそのまま返るといった case 文があります。

      def full_url_for(options = nil) # :nodoc:
        case options
        when nil
          _routes.url_for(url_options.symbolize_keys)
        when Hash, ActionController::Parameters
          route_name = options.delete :use_route
          merged_url_options = options.to_h.symbolize_keys.reverse_merge!(url_options)
          _routes.url_for(merged_url_options, route_name)
        when String
          options

https://github.com/rails/rails/blob/v6.0.0/actionpack/lib/action_dispatch/routing/url_for.rb#L173-L182

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away