Tech Racho エンジニアの「?」を「!」に。
  • 開発

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

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。