3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

link_toの引数がnil(null)で想定していないリンクが生成れたので検証してみた

Posted at

前提

インスタンス変数を引数にして、link_toでリンクを生成する際、指定した覚えのないリンクが生成されました。
生成されたのはそのページのリンクで、どうやら引数にnilを渡していると発生するようだ。
関連するページを発見できなかったので、検証結果と解決策を記載してみる。
なお、当方は初学者なので、見当違いであればコメントをいただけると幸いです。

環境

ruby 2.6.5
Ruby On Rails 6.0.0

TL;DR

http://localhost:3000/hoge/3というページ内で以下の記載をした場合
以下のように、そのページのリンクが生成される。(誰が使うねん)
<%= link_to nil,nil %>

=> <a href="/hoge/3">/hoge/3</a>

渡ってくるデータにnilが入る可能性がある場合は、以下のようにすると、nilの場合はブランクとなる。
@hoge・・・urlデータかnil

<%= link_to_if @hoge, @hoge, @hoge %>
空文字やスペースを入る可能性があるなら(そのへんはバリデーション対応するべき?)
<%= link_to_unless @hoge.blank?, @hoge, @hoge %>

詳細(検証と解消方法)

link_to(使い方)
link_to(リンクテキスト, パス [, オプション, HTML属性 or イベント属性])

リンクテキストがnilの場合は、パスに入れた内容がリンクテキストとして表出する

<%= link_to nil, "https://twitter.com/" %>

=> <a href="https://twitter.com/">https://twitter.com/</a>

パスがnilだった場合(http://localhost:3000/hoge/というページに記載)
カレントページのリンクが生成される

<%= link_to "hoge", nil %>

=> <a href="/hoge/">hoge</a>

なのでリンクテキストにもnil,パスにもnilが入っていると、
パスがnilなのでカレントページのリンクが生成される
→リンクテキストがnilなのでカレントページのリンクが表出されると思われる。

解消方法
使い方
link_to_if(条件式, リンクテキスト, url [, オプション, HTML属性 or イベント属性])

@hoge・・・urlデータかnil

<%= link_to_if @hoge, @hoge, @hoge %>

↑のようにすれば、@hogeがnilの場合は何も生成されず、データばあるときのみ生成される。

参考文献

https://railsdoc.com/page/link_to
https://railsdoc.com/page/link_to_if
nilを入れたときの動きが↓に書いてある。(link_toは結局url_forを呼ぶので)
https://github.com/rails/rails/blob/f33d52c95217212cbacc8d5e44b5a8e3cdc6f5b3/actionview/lib/action_view/routing_url_for.rb#L79

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?