Railsでアプリを作っていたときに気になったことですが、データにチェックをかける箇所が3通り考えられます。
- ビューのHTML、JavaScriptレベル
- Railsレベル
- RDBMSレベル
今回の疑問としては、このうち「ビューレベル」と「DBレベル」で制約をかけた場合に、途中のRailsレベルでもさらにバリデーションをかけることには何かしらのメリットがあるのか、ということです。
もちろん、「整数の範囲」や「文字列の長さ」といった制約条件であれば、モデルに定義するのもほとんど手間が発生しませんので、3重に制約をかけても、特段のデメリットはないでしょう。
ただ、FOREIGN KEY制約については、モデルでもバリデーションをかけようとすると、「モデルレベルのチェックのために別途でDBを引く必要がある」という処理負荷が発生します。
そして、選択系の入力フォームをラジオボタン・チェックボックス・ドロップダウンといったウィジェットで構築した場合、デバッグツールなどで無理やり書き換えない限り、事前に用意した値しか書き込めません。
一方、無理やり書き換えたところで、DB側でFOREIGN KEY制約を正しくかけてあれば、不適切なデータの書き込みは不可能ですし、正当な動作でたどり着くものではありませんから、「DBエラーで食い止められるならそれでいい」ともなります。
このような状況下で、Railsのモデルレベルでもバリデーションを加えて、「不正な値に書き換えられたときにもバリデーション失敗として処理する」必要性・メリットはどの程度ありますでしょうか。
(なお、APIの場合、ビューレベルでのチェックはないので、Railsレベルでのチェックも必要だと考えています。また、リンクさせる先はマスター系なので、「入力フォームの表示後に値が不適切になる」ことも考えなくて大丈夫です。)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/01 23:35