my_back_pages

プログラミング学習の記録 Ruby / Rails / FjordBootCamp

【Rails】Rinku で localhost:3000 をリンク化できない問題と解決法

表題通りです。

解決したいこと

URLの文字列をリンク化できるgem「Rinku」でlocalhost:3000というURLをオートリンクしようとしたら反映されない。

# app/views/tasks/show.html.slim

.nav.justy-content-end
  = link_to "一覧", tasks_path, class: 'nav-link'
table.table.table-hover
  tbody
# 中略
    tr
      th= Task.human_attribute_name(:description)
      td= raw Rinku.auto_link(simple_format(h(@task.description), {}, sanitize: false, wrapper_tag: "div"), # Rinku.auto_link でURLをリンクに自動変換

@task.description にはURLの文字列が入っている。

反映されない……。

google.comなどの普通のURLはリンク化される。

サニタイズの設定やヘルパーメソッド(h)の問題かと思ったけれど、その辺をなくして素のURL文字列("http://localhost:3000/tasks/id")をRink.auto_linkメソッドの引数に入れても機能しない。

ということはそもそもの「localhostというURLを入れる」というシナリオそのものに問題がありそう。

解決法

オプションを下記のように指定する。

Rinku.auto_link('http://localhost:3000/a', nil, nil, nil, Rinku::AUTOLINK_SHORT_DOMAINS)

参考 : https://github.com/vmg/rinku/issues/7

# app/views/tasks/show.html.slim

    tr
      th= Task.human_attribute_name(:description)
      td= raw Rinku.auto_link(simple_format(h(@task.description), {}, sanitize: false, wrapper_tag: "div"), nil, nil, nil, Rinku::AUTOLINK_SHORT_DOMAINS) # 修正

補足: なんでこんなことにハマったのか

現在Railsの基礎を、 フィヨルドブートキャンプで参考図書として紹介されている『現場で使える Ruby on Rails 5速習実践ガイド』(通称: 現場Rails)で勉強しています。

magazine.rubyist.net

スクショのようなシンプルなタスク管理アプリを作りながら学習を進める中で、サブミットされたタスク本文のうちURL部分をリンク化する、というパートがあります。

その箇所で、リンク化する方法として「auto_link」と「Rinku」という2つのgemが紹介されており、「Rinku」の方は「auto_linkの20倍早い(と製作者が仰っている)」方法として軽く説明されている、という感じです。

パッと「Rinku」でググると、確かに「auto_link」より速い方法として日本語の紹介記事もたくさん出てくるので、軽い気持ちで試してみようと、とりあえずそのときにブラウザで表示されていたlocalhost:3000のURLを使ったところ、上記の沼にハマった次第です。

ちなみに、「auto_link」ではオプションを細かくしていなくてもlocalhost:3000をオートリンク化してくれます。

どのようなシチュエーションでこの知識が役に立つのかは、今の私にはまだ想像がついていませんが、日本語におけるこの事象の紹介がググった結果にパッと見ではなかったので、アウトプットしてみました。

参考にさせていただきました

github.com

qiita.com