QA@IT

文字列にURLがあれば、自動的にリンクを追加する方法は何ですか?

4140 PV

例:

<%= "This is a test.Please visit http://qa.atmarkit.co.jp." %>

こんな結果が欲しい:

This is a test.Please visit http://qa.atmarkit.co.jp.

Railsは便利なヘルパーがありますか?

回答

Rinku という gem がよさげですが、どうでしょう。

require 'rinku'

Rinku.auto_link(text, mode=:all, link_attr=nil, skip_tags=nil)

Rails 3.1になるまでは、ActionView::Helpers::TextHelperに auto_link というそのものズバリのヘルパーメソッドがあったものの、今は deprecated でなくなったようです。

http://apidock.com/rails/ActionView/Helpers/TextHelper/auto_link

互換性のために、tenderloveさんというRailsコアチームの1人がRailsから除去した auto_link を gem として公開しています( https://github.com/tenderlove/rails_autolink )。それをRailsでそのまま使うための rails_autolink というのもありますね。

Rinkuは、tanokuさんというGitHubの中の人が作っているようで、Cで書いてあって、正規表現とか使わずにパースしてるのでauto_linkの20倍ぐらい速いよと言ってますね。さすがGitHubという感じです。が、ふつうのアプリだと誤差ですよね、きっと。

編集 履歴 (0)
  • とても詳しい回答です!ありがとうございます。
    Rinku is about 20 times faster.And it's about 20 times smarter when linking.
    Good!
    -
  • 追問:
    Rinku と simple_format で動きが正しくないの原因は何ですか?
    simple_format(Rinku.auto_link(text, :all, 'target="_blank"', nil))
    -
  • 動きが正しくないとは? -
  • link_attr='target="_blank"' を設定しても、htmlソースにこのattributeが見えない。ですので、自身ページに遷移した。 -
  • https://gist.github.com/1083456 にあるように、auto_link と simple_format の順番を逆にするというのでどうでしょうか -
  • ご回答ありがとうございます。Rails3.2の場合、require 'rails_rinku'はエラーがあります。
    とりあえず、rails_autolinkを使って、
    This works fine:
    auto_link(simple_format(@task.description), :html => { :target => "_blank" })。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。