バリデーション(Validation)とは?
たとえば、入力フォームで「名前」などの項目が抜けて登録しようとした際に、保存させずに「名前が抜けていますよ!」のようなエラーを表示させて再入力を求めたい場合があると思います。こういった処理をrailsではバリデーションの設定によって簡単に作ることが可能です。
バリデーションの追加方法は?
modelの中に「validates」を記載する。
class Group < ApplicationRecord
validates :name, presence: true
end
上記の場合、nameカラムに対応する入力内容がpresence(存在しているか?)がtrueの場合にのみデータが保存されるよ!という設定になります。
他にも色々オプションをつけることができます。たとえば、
class Group < ApplicationRecord
validates :name, presence: true,
length: { minimum: 8}
end
このように記載すれば「8文字以上か? 」という検証も追加で行うことができます。
両方の条件をクリアした場合にのみデータが保存されます。
controllerの中にデータのセーブに「成功」「失敗」それぞれの場合の処理を記載する。
def create
@group = Group.new(group_params)
if @group.save
redirect_to :root #成功の場合
else
render 'new' #失敗の場合
end
end
「validate」による検証によって、条件を満たさなければデータのセーブがされなくなります。したがって、データのセーブに「成功」、「失敗」それぞれの処理を上記のようなif文の形で記載します。
↓グループ名を入力せずに「save」をすると↓ データはセーブされずにフォームTOPに戻るようにしました。失敗の場合に「エラー文」を表示したい。
今のままだと、データのセーブに失敗した場合にただフォーム入力画面に戻ってしまうだけなので、利用者はエラーに気づかず困惑してしまいます。失敗の場合にはエラー文を表示してあげたいですよね。
ビューのエラー文を表示したい箇所に「if 〇〇.errors.any?」を記載する。
ビューのエラー文を表示したい箇所に下記のように追加します。
<% if @group.errors.any? %>
<p>エラーでーす。</p>
<% end %>
「.errors.any?」を用いることで、エラーが発生しているかを判定することができます。
上記の「エラーでーす。」のところに、エラーの際に表示したい内容を記載することで、エラー文が表示されます。
エラーメッセージについては「@group.errors.count」を用いることで「○件のエラーがあります」と表示することができる等、テクニックがまたありますが、今回はバリデーションの追加方法ということで、この辺で区切りたいと思います。