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を使う場合はこのような問題は起こりません。

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

tsunekawa

tsunekawaの書いた記事

開発
Windowsにも開発環境が欲しい

2018年12月23日

開発
VimではじめるTerminalモード

2018年09月11日

開発
Vim部活動日誌

2014年06月20日

夏のTechRachoフェア2019

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ