railsでマイグレーションファイルのカラムに
null:false
をつけるのと、
モデルで
validate :name presence: true
をつけるのは役割が被っている気がするのですが、厳密には違うのでしょうか?
また、併記する必要があるのか?
どっちかでいいのか?
曖昧な認識でしかないので詳しい方教えていただけるとありがたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
モデルのバリデーションは、想定しうる入力の間違いをチェックするものですが、
自分が想定していなかったものはすり抜けてしまいます。
最後の砦、保険となるのが、DB側の制約です。
モデルを修正していくうちに、validate :name presence: true を
うっかり削除してしまうかもしれないし、
新規に作ったモデルで付け忘れる可能性もあります。
重複しているように見えても役割は別物なので、モデルのバリデーションもDB側の制約もきちんと設定すべきです。
投稿2016/12/26 02:26
総合スコア4255
0
ベストアンサー
railsの動作ですが
migrationファイルに
:name#, :null => false
と記載した場合にモデルのインスタンスをsaveすると
ActiveRecord::StatementInvalid: PG::NotNullViolation: ERROR: null value in column "name" violates not-null constraint
というエラーがraiseされます。(postgresの場合)
モデルに
validates :name, presence: true
と記載した場合はrails側でのチェックが走りますので、
モデルのインスタンスに対して #save、 #valid? などを実行した場合falseが返り、インスタンスのerrorsにエラーがセットされます。
上の結果から
- データベースにチェックしてもらうよりも事前にチェックしたほうが安全
- 同じモデルに対して他のvalidationも併用する場合にmigrationファイルに定義すると、チェックするタイミングがずれる
ため、modelで定義するほうがいいかと思います。
また、通常(scaffoldなどで)作成したcontrollerでは
ruby
1def create 2 model = Model.new(model_params) 3 4 if model.save 5 # 成功時の処理 6 else 7 # unprocessable entity(422)などのvalidationエラーの処理 8 end 9end
のようになるので、railsではmodelでvalidationを定義することを前提にしてそうです。
投稿2016/12/24 17:03
総合スコア843
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。