日々精進

新しく学んだことを書き留めていきます

Rails - validates

・validatesではまる
データをInsertできないという不具合が発生。
色々と調べた結果、モデルクラスでnilでもいい項目に対してvalidatesを実行しているためと判明。
具体的には

  validates_length_of :email, :maximum => 200

とモデルクラスに書くと、emailがnilだとエラーになる。
nilでも登録可能にしたい場合は↓のように書けばいい、はずなのだがなぜかだめ。

  validates_length_of :email, :maximum => 200, :allow_nil => true

script/consoleでコマンドライン実行した時は:allow_nilが正しく動作するがブラウザから実行すると動作しないという不可思議な状況。
script/consoleの仕組みをわかってないんだけど、Mongrelサーバの問題か?
代わりに:ifを使うことで回避。:allow_nil => trueは↓の用に書くと同じ動作を実現できる。

  validates_length_of :email, :maximum => 200, :if => Proc.new { |p| p.email != nil}

これでほぼOKだが、:withでフォーマットをチェックしている部分だけnilが入るとエラーになる。コードは↓。

  validates_format_of :email, 
                      :with => /^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/, 
                      :if => Proc.new { |p| p.email != nil}

しょうがないのでこの部分はコメントアウト。後で原因調査したいな。

そもそもこの原因を調べるのに時間がかかったのはエラーメッセージを出していなかったから。
モデルを登録する際のエラーメッセージは必ず出力するよう気をつけねば。


リファクタリングを行う
ふと思い立ってコントローラクラスにあったDBアクセス部分をモデルクラスに移動させた。
永続化レイヤー(DB,ファイルシステム等HDDにデータを記録するレイヤー)はロジックとは切り離して抽象化すべきだし。
コードを移動させてみると、コントローラが超すっきり。いやー、やってよかった