Ruby on Rails2.1 validateメソッドの学習
StrutsのActionForm#validateと同じ機能がRailsにもあります。
RailsにもActionFormのようなrequest情報を保持し、簡単にアクセスできるparamsという変数のオブジェクトがあります。ただ、validateメソッドを定義するのはそこじゃぁない。どこかというとモデルクラスに記述する。こんな感じ。
class Project < ActiveRecord::Base validates_presence_of :name
こうすると、名前は必須ということになる。他にも入力項目が数字かどうか判定する「validates_numericality_of」や長さが超えていないかどうかを判定する「validates_length_of」など色々存在する。とはいえ、独自のルールチェックを行いたい場合もあるので、そんなときはvalidateメソッドを定義する。
class Project < ActiveRecrod::Base private def validate // 独自チェック end
とまぁこんな感じ。
StrutsのActionForm#validateと比較すると、Railsのようにモデルクラスにチェックロジックがある方が凝集性が高まっていい。例えばProjectクラスのname属性(プロジェクト名称)が必須であったり、nameが256バイトであるべきだということを知っているのはProject自身であるべきだから。それを別のクラスで定義してしまうと、カプセル化が少々崩れてしまう。
しかしながら疑問もある。ActionForm#validateの実行タイミングがコントローラークラスの処理前なのに対して、Railsのvalidate系メソッドの実行タイミングはsaveやupdate処理の直前。これだと、画面の内容をそのまま永続化する場合はいいけど、画面からわたってきた内容をもとにオブジェクトのとある属性値が決定するような場合、validateよりも先にそちらの処理が実行されるため、不正な値を入力されるとエラーになってしまう。
もしかしたら何か別の手段がありそうな気もするが、現時点では謎です。