箱のプログラミング日記。

えんじにあ奮闘記

Railsのエラーメッセージを好きなものに変更【バリデーション】

f:id:y_hakoiri:20191102121704j:plain

バリデーションとは

 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 :namenumericality: { 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
 

https://i.gyazo.com/b923fc57fbec6ca961d6bb51e7e05989.png

.full_messagesが該当のエラーを配列で全て返してくれるので、

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タグとかで「入力」を促すと少し不自然な場合

 

https://i.gyazo.com/3391ab275d0a7ae3c91e9e092c4b75e8.png

こういう風に自由にいじれたらとても良い

 

この場合、バリデーションの書き方から変える必要があります

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: " "
 
結局、こうやって「日本語化」ならぬ「空白化」することで
半ば無理やり?カラム名を表示させないように変更することができました。。

 

https://i.gyazo.com/3391ab275d0a7ae3c91e9e092c4b75e8.png

 
丸一日粘って色々調べたものの、うまい感じに分解することができませんでした。
とりあえず目的は達成できたので良いかな。。
 
 

ビューのレイアウト崩れを直す

エラーメッセージが表示されると、なぜか全然関係ないところのビューが崩れてしまう
 
これはエラーメッセージがデフォルトでdivで囲まれているからだそうで、
そのスタイルを外してくれるのが以下
config.action_view.field_error_proc = Proc.new { |html_tag, instance| html_tag }
 
この一行をconfig/application.rbに追加するだけで OK