表題通りです。
解決したいこと
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)で勉強しています。
スクショのようなシンプルなタスク管理アプリを作りながら学習を進める中で、サブミットされたタスク本文のうちURL部分をリンク化する、というパートがあります。
その箇所で、リンク化する方法として「auto_link」と「Rinku」という2つのgemが紹介されており、「Rinku」の方は「auto_linkの20倍早い(と製作者が仰っている)」方法として軽く説明されている、という感じです。
パッと「Rinku」でググると、確かに「auto_link」より速い方法として日本語の紹介記事もたくさん出てくるので、軽い気持ちで試してみようと、とりあえずそのときにブラウザで表示されていたlocalhost:3000
のURLを使ったところ、上記の沼にハマった次第です。
ちなみに、「auto_link」ではオプションを細かくしていなくてもlocalhost:3000
をオートリンク化してくれます。
どのようなシチュエーションでこの知識が役に立つのかは、今の私にはまだ想像がついていませんが、日本語におけるこの事象の紹介がググった結果にパッと見ではなかったので、アウトプットしてみました。