バリデーションとは
validate・・・検証する
ユーザーがフォームに値を入力してsubmitする時などに制限をかけること。
例)入力必須、◯文字以下など
基本的な書き方
対象モデルに書く。
validates :カラム名, 条件
空じゃないかどうかを検証
class Post < ApplicationRecord
validates :name, presence :true
end
40文字以下かどうかを検証
class Post < ApplicationRecord
validates :name, length: { maximum: 40 }
end
数値に関するオプションは以下のように設定できます
100以上1000以下
class Post < ApplicationRecord
validates :name, numericality: { greater_than_or_equal_to: 100, less_than_or_equal_to: 1000}
end
細かい条件やオプション等はリファレンスに結構載っていました
検証(validation) - - Railsドキュメント
ビューで表示させる
モデルにバリデーションが記述できたら、
検証をクリアできなかった時にビューでエラーメッセージを表示させることができます
ビューファイルに以下のように記述(hamlで書いてます)
- if @post.errors.any?
- @post.errors.full_messages.each do |message|
= message
エラーメッセージの日本語表記化
gem 'rails-i18n'
「i18n」はinternationalizationのこと
iとnの間に18文字あるからこうやって書くらしい。ヘェ〜
bundle install → rails sでサーバー再起動(忘れずに)
config/application.rbに以下を追加
config.i18n.default_locale = :ja
こうすると日本語化できる
ただこのままだと、カラム名は英語のままで
「nameを入力して下さい」みたいな感じで中途半端になるので
(日本語化してくれたので「を入力して下さい」の部分のみ)
カラムも日本語で表示できるようにja.ymlを編集
ja:
activerecord:
attributes:
post: //モデル名
images: "画像" //カラム:日本語
name: "商品名"
これでやっと全体が日本語になる。
エラーメッセージを好きなようにいじりたい
苦戦したのはここから。笑
デフォルトだとpresence :trueのエラーメッセージは「を入力して下さい」だけど
例えばselectタグとかで「入力」を促すと少し不自然な場合
こういう風に自由にいじれたらとても良い
この場合、バリデーションの書き方から変える必要があります
if category.blank?
errors[:category] << "選択して下さい"
end
こうすると、categoryカラムに対してpresence :trueを指定してくれるとともに
エラーメッセージも「選択して下さい」に変更することができる。
brank?でcategoryが空だった場合のerrorsを指定する感じ。
if category.blank?
errors[:base] << "選択して下さい"
end
ちなみにこうすると、個々のカラムに対してではなく
エラーメッセージ全体に対して適用させることができる
話を戻して、categoryに対してエラーメッセージが指定できたら
ビューでは「caegory選択して下さい」みたいになってる。
このcategory(カラム名)を取りたいんだよな、、
- if @post.errors.any?
- @post.errors.messages.each do |message|
= message
full_messagesのfullをとってみたり、keyとvalueにわけてどうにか
attrを外してメッセージ側だけ取得できないか色々試みてみたもののうまくいかず。
ja:
activerecord:
attributes:
post: //モデル名
images: "画像" //カラム:日本語
name: "商品名"
category: " "
結局、こうやって「日本語化」ならぬ「空白化」することで
半ば無理やり?カラム名を表示させないように変更することができました。。
丸一日粘って色々調べたものの、うまい感じに分解することができませんでした。
とりあえず目的は達成できたので良いかな。。
ビューのレイアウト崩れを直す
エラーメッセージが表示されると、なぜか全然関係ないところのビューが崩れてしまう
これはエラーメッセージがデフォルトでdivで囲まれているからだそうで、
そのスタイルを外してくれるのが以下
config.action_view.field_error_proc = Proc.new { |html_tag, instance| html_tag }
この一行をconfig/application.rbに追加するだけで OK