Validationの意味
検証
データを保存する前にこのデータを保存しても、良いのか悪いのかを検証するもの。
長さに関するValidation
app/models/article.rbに記入
validates :title, presence: true
validates :content, presence: true
現在は、これが記入されています。
length
長さを指定するValidation 例 タイトル何文字以上で記入してください。 記事を何文字以上で書きなさい。 などの長さを指定するときにlengthを使用する。〜以上にする場合
validates :title, length: { minimum: 2 }
validates :カラム名, length: { minimum: 2 }
最低2文字以上ないとダメですという意味
rails sで、サーバーを再度立ち上げる。
その後動作確認すると、タイトルは2文字以上で入力してください!となる♪
2文字以上にすると保存ができました🙆
例えば、contentを10文字以下にしたい場合は、
validates :content, length: { minimum: 10 }
このようになります。
〜以内にする場合は、
validates :title, length: { maximum: 100 }
100文字以内となる。
○まとめ
Validationのlengthは、長さを指定るするものです。uniqueness
同じ内容である場合は、困るときに使える👍例:投稿内容が、全く同じである場合は、エラーを起こす。
validates :content, uniqueness: true
この状態で、試すと
内容はすでに存在します。と出てきます🙆
よく使う場面
ユーザーアカウント名、メールアドレス など
format
特定の表現に対してValidationをかける。 こういった表現でないとダメですよ〜という感じ! 例:@で始まるテキストでないとダメですよ (@がついて.~でないとダメだよ) テキストの形を指定するものhttps://rubular.com/
で試してみてください👍
Rubyの正規表現
\A\@
となると先頭に@がついていないと合致しない
\A(?!\@)
@から始まらないが合致する
validates :title, format: { with: /\A(?!\@)/ }
こうすると、@で始まった場合
タイトルは不正な値ですと出力されました。
emailなどよく使うものの場合は、わからなければ検索すると表現の仕方が出てきます👍
「email ruby 正規表現」
独自のValidationを追加する方法
例えばtitle,contentの合計がいくつ以下にしなさいというルールを作るとする。複数のカラムを参照してルールを作るのは、railsで用意されていない!!
自分でルールをつくる!
validate :validate_title_and_content_length
※sがない
private
def validate_title_and_content_length
char_count = self.title.length + self.content.length
unless char_count > 100
errors.add(:content, '100文字以上で!!')
end
end
自分で定義をする。(100以上)
※char:読み:キャラクター 、意味:文字
※char_count:文字数
erros.add(:カラム )
このカラムにエラーを追加しますよという意味
Validationは何かのカラムに対して、アラート、エラーを起こすためのもの
これで100文字以下で、投稿しようとすると
内容は、100文字以上で!!と出力されました!!
※内容は=content content を日本語にしたもの
private
def validate_title_and_content_length
char_count = self.title.length + self.content.length
errors.add(:content, '100文字以上で!!') unless char_count > 100
end
一行で書くこともできる!
errors.addとは??
app/views/articles/_form.html.haml
article.errors.full_messages
ここでメッセージ全て表示している!
Validationでエラーが起こったときに、errorsに何か追加される。
その追加されたメッセージを表示しているのがここ!
validatesの場合、失敗したら勝手にerrors.addに追加している。
validateで、自分たちでエラーを追加した場合は、そこも自分たちで追加しないといけない!!よって、errors.addで追加していることになる😆