Railsでバリデーションのエラーメッセージを日本語のオリジナルにする方法
こんにちは、@Yuuです。
最近Railsの勉強を始めました。
いやぁ、書き方がまだまだ良く分からないところだらけですが、楽しいですね!
Railsでバリデーションチェックを行う時は、ActiveRecordを使用すると思うのですが(それ以外の方法が分からない・・)、
その際のエラーメッセージは以下のように英語で表示されてしまいます。
今回はこのformでのエラーメッセージを、自分の好きなメッセージで表示する方法を学んだので、備考録がてらご紹介したいと思います。
スポンサーリンク
やりたいこと
今回は「product」(商品)というModelを作成します。
productの要件はこんな感じ。
- productには、名前・価格・詳細がある。
- 名前と価格が入力されていない場合は、登録出来ないようにする。
- 名前と価格どちらかが入力されていなかったら、エラーメッセージを日本語で表示する。
最終的には以下のようなエラーメッセージを表示出来るようにしたいと思います。
では作っていきましょう!
1. productを作成
今回はサクッとscaffoldを使って作成します。
1 |
$ rails g scaffold product name:string price:integer detail:text |
これで要件の1番目、"productには、名前・価格・詳細がある"の完成です。
Railsだと速いですね!(๑•̀ㅂ•́)و✧
2. バリデーションを追加
次にapp/models/product.rb
を編集してバリデーションを追加します。
以下のように書くことで、簡単にバリデーションを追加することが出来ます。
1 2 3 4 5 6 7 8 |
class Product < ActiveRecord::Base #名前が入力されていなかった場合エラーを返すバリデーション validates :name, presence: true #価格が入力されていなかった場合エラーを返すバリデーション validates :price, presence: true end |
試しにrails s
を実行し、http://localhost:3000/products/new
を開いて何も入力せずに、「create Product」ボタンを押してみると、
最初に貼った画像のように、エラーメッセージが表示されるようになりましたね。
ただ、このままだと英語で何書いてあるか分からん!(ง `ω´)۶
となってしまうので、ここから本題の日本語でエラーメッセージを表示する方法を書いていきたいと思います。
本当はconfig/locales
内にja.ymlというファイルを作成し、
処理を追記することで対応出来るのですが、今回はそれとは違う方法をとりたいと思います。
3. エラーメッセージを日本語で表示する
app/models/product.rb
の内容を再度変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class Product < ActiveRecord::Base #名前が入力されていなかった場合エラーを返すバリデーション #validates :name, presence: true #価格が入力されていなかった場合エラーを返すバリデーション #validates :price, presence: true validate :add_error_sample def add_error_sample # nameが空のときにエラーメッセージを追加する if name.blank? errors[:base] << "商品名は必ず入力して下さい" end # 価格が空のときにエラーメッセージを追加する if price.blank? errors[:base] << "価格は必ず入力して下さい" end end end |
4,7行目をコメントアウトし、9~21行目を追加しました。
9行目で「バリデーションチェックをする時は、add_error_sampleメソッドを参照してね」と設定し、11~21行目でadd_error_sampleメソッドを定義しています。
そして、add_error_sampleメソッド内で、名前と価格が空ではないかを確認し、空の場合はエラーメッセージを追加する、という流れになっています。
では、実際に確認してみたいと思います。
先程と同じようにhttp://localhost:3000/products/new
を開いて何も入力せずに、「create Product」ボタンを押してみると、
よっしゃ!
無事エラーメッセージを日本語で表示出来ました!(๑•̀ㅂ•́)و✧
あとがき
Railsは本当に速いですね。
ここまでの事をjspやservletを使って1から作ろうと思ったら、かなりめんどくさいので、僕だと20分ぐらいは最低でもかかると思いますが、
Railsだとものの5分あれば出来てしまいますもん・・。
次に作るWebアプリではRails使って作ってみたいなぁと思っているので、引き続きRailsの勉強頑張ろうと思います。
では!
今回はこの辺で!ヽ(•̀ω•́ )ゝ✧