rails3 + simple_form + validates_format_of でsubmitできないとき

Rails3 でsimple_formを使っていると
simple_form がJavaScript で入力値の検証をしてくれるのですが
validates_format_of のwithパラメータに記述した正規表現によっては、
正しい値を入力しているにも関わらずsubmitできないという現象が起こります。

サンプル事例

例えば、model側で
/\A[a-zA-Z]\z/ というformatを指定した場合

validates :name, format: {with: /\A[a-zA-Z]+\z/}

simple_form_validation

JavaScriptでも同じ正規表現でチェックを実行しますが、JavaScriptの正規表現では
\A \z が文字列の先頭、末尾として解釈されない為
アルファベットだけを入力していても、submitできなくなります。

この場合 withパラメータで設定する正規表現をJavaScriptでも解釈されるものに変更すれば
submitできないという問題は解決しますが、場合によっては不正な値を許容してしまう可能性があるので
novalidate をtrue にしてJavaScriptによるチェック自体をOFFにしてしまった方が安全かもしれません。

<%= simple_form_for(@user, html: {novalidate: true}) do |f| %>

今回の例のように
\z を $ に変更した場合、改行文字が含まれる文字列は改行文字以降に意図したチェックがかからなくなるため危険です。
http://stackoverflow.com/questions/577653/difference-between-a-z-and-in-ruby-regular-expressions

Rails4

Rails4に対応した3.0.0 以降はvalidates_format_of によるチェックはskipするようになったため
Rails4でsimple_formを使う場合はこのような問題は起こりません。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ