URL書式のチェックと表示

validateによる検証でURL書式のチェックをどうするべきか悩んでいたが、kantaさんにヒントをもらい、現状の自分のレベルではシンプルさを求めて以下のようにコーディングした。(kantaさん、ありがとう!)

モデル software.rb
class Software < ActiveRecord::Base
  validates_format_of :url, :with => URI.regexp(['http', 'https', 'ftp'])
end

URI.regexp(['http', 'https', 'ftp'])で、http、httpsftpのURL形式の正規表現が取得できる。

      • ちなみに、URLはURIで表現される一つの形式らしい。詳細についてはURIとはで確認させて頂いた。感謝です。
ビュー list.rhtml
<h1>Listing softwares</h1>

<table>
  <tr>
  <% for column in Software.content_columns %>
    <th><%= column.human_name %></th>
  <% end %>
  </tr>
  
<% for software in @softwares %>
  <tr>
  <% for column in Software.content_columns %>
    <td><%= link_to_if column.name == 'url',
                       h(software.send(column.name)), 
                       URI.encode(software.send('url'))  %></td>
  <% end %>
...(以下省略)...

URI.encode(URL文字列)と囲ってあげることで、URL文字列にタグ等が含まれていてもURLエンコードされた文字列に変換される。そのため、意図しないタグとしての機能は無くなり、安心してURL文字列として利用できる。

  • URI.regexpで得られる正規表現は、自分が考えていたよりも、かなり自由なURL形式を許してくれるようだ。(「<」「>」も入力可能だ。)
  • そのため、データベースへの入力は可能な限り自由を与えて、アプリケーション内で利用する時、意図しない動作を防止する方針にした。
  • URLエンコードU(URL文字列)としても得られるが、http://の文字列先頭からエンコードされてしまうので、リンク先としても機能しなくなってしまう。*1URI.encode()なら、どこからURLエンコードすべきか書式を見て賢く判定してくれる!

*1:h(HTML文字列)の書き方のURL文字列版