URL書式のチェックと表示
validateによる検証でURL書式のチェックをどうするべきか悩んでいたが、kantaさんにヒントをもらい、現状の自分のレベルではシンプルさを求めて以下のようにコーディングした。(kantaさん、ありがとう!)
- モデル software.rb
class Software < ActiveRecord::Base validates_format_of :url, :with => URI.regexp(['http', 'https', 'ftp']) endURI.regexp(['http', 'https', 'ftp'])で、http、https、ftpのURL形式の正規表現が取得できる。
- ビュー 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文字列版