質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

2回答

8946閲覧

【Rails】モデルのValidationが作動するタイミング

Miracle

総合スコア54

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2016/10/16 13:54

モデルにvalidates, xxx, presence: trueという形でバリデーションを記述しますが、ここに該当するxxxをビューから送信しない場合は、バリデーションに引っかかるのでしょうか?

例えばビューからツイートに関するcontentを送ったとします。ライターは、コントローラ側で追加するとして、モデルとコントローラそれぞれ、以下のような記述になるとします。

コントローラ

省略 def create Tweet.create(tweet_params) end private def tweet_params params.require(:tweet).permit(:content).merge(user_id: current_user.id) end 省略

モデル

class User < ActiveRecord::Base 省略 validates :content, :user_id, presence: true 省略 end

この場合だと、user_idはビューから送っていませんが、バリデーションに引っかかるのでしょうか?

自分の場合、試しても引っかからないのですが、知り合いがそのようなことは無いと言っているので、バリデーションがどの段階で作動するのかを教えてほしいです(コントローラのアクション後なのか、前なのか、そもそもビューから送らないものは全て引っかかるのか etc)。

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

validation が実行されるのは以下のメソッドが呼び出されたタイミングですので、それまでに対象のモデルがvalidな状態になっていれば大丈夫です。

  • create
  • create!
  • save
  • save!
  • update
  • update!

明示的に valid? メソッドを呼び出して検証する事も可能です。


ところで Ruby on Railsガイド はお読みになった事がありますでしょうか?
非常に有益な情報がつまっていますし、興味のあるところから読めますのでぜひ一度御一読をお勧めします。

今回ですと Active Record バリデーション1.2 バリデーション実行時の動作 あたりの話題です。

投稿2016/10/17 00:06

hana-da

総合スコア1728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Miracle

2016/10/17 05:17

よんでみます! ありがとうございました! m(_ _)m
guest

0

ベストアンサー

validationはビューからの送信かどうかは関係ありません。
ここでは

validates :content, :user_id, presence: true

ということなので、contentuser_idの値がnilまたはblankではないことを検証します。

validationを行っているのは以下のcreateのタイミングですが、

Tweet.create(tweet_params)

contentがviewから渡っている場合、以下の処理でuser_idもcurrent_userから取得されていますし、
contentとuser_idはpresenceということになるので、validationにはひっかかりません。

ruby

1def tweet_params 2 params.require(:tweet).permit(:content).merge(user_id: current_user.id) 3end

投稿2016/10/16 14:04

cameluby

総合スコア891

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Miracle

2016/10/17 05:17

ありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問