Rails
初心者
RubyOnRails
入門

【Rails】バリデーションの追加方法とエラーメッセージの表示

More than 1 year has passed since last update.


バリデーション(Validation)とは?

たとえば、入力フォームで「名前」などの項目が抜けて登録しようとした際に、保存させずに「名前が抜けていますよ!」のようなエラーを表示させて再入力を求めたい場合があると思います。こういった処理をrailsではバリデーションの設定によって簡単に作ることが可能です。

スクリーンショット 2017-05-07 16.38.15.png


バリデーションの追加方法は?


modelの中に「validates」を記載する。


group.rb

class Group < ApplicationRecord

validates :name, presence: true

end


上記の場合、nameカラムに対応する入力内容がpresence(存在しているか?)がtrueの場合にのみデータが保存されるよ!という設定になります。

他にも色々オプションをつけることができます。たとえば、


group.rb

class Group < ApplicationRecord

validates :name, presence: true,
length: { minimum: 8}
end

このように記載すれば「8文字以上か? 」という検証も追加で行うことができます。

両方の条件をクリアした場合にのみデータが保存されます。


controllerの中にデータのセーブに「成功」「失敗」それぞれの場合の処理を記載する。


groups_controller.rb

def create

@group = Group.new(group_params)
if @group.save
redirect_to :root #成功の場合
else
render 'new' #失敗の場合
end
end

「validate」による検証によって、条件を満たさなければデータのセーブがされなくなります。したがって、データのセーブに「成功」、「失敗」それぞれの処理を上記のようなif文の形で記載します。

スクリーンショット 2017-05-07 16.38.00.png

↓グループ名を入力せずに「save」をすると↓

スクリーンショット 2017-05-07 16.37.02.png

データはセーブされずにフォームTOPに戻るようにしました。


失敗の場合に「エラー文」を表示したい。

今のままだと、データのセーブに失敗した場合にただフォーム入力画面に戻ってしまうだけなので、利用者はエラーに気づかず困惑してしまいます。失敗の場合にはエラー文を表示してあげたいですよね。


ビューのエラー文を表示したい箇所に「if 〇〇.errors.any?」を記載する。

ビューのエラー文を表示したい箇所に下記のように追加します。


new.html.erb

<% if @group.errors.any? %>

<p>エラーでーす。</p>
<% end %>

「.errors.any?」を用いることで、エラーが発生しているかを判定することができます。

上記の「エラーでーす。」のところに、エラーの際に表示したい内容を記載することで、エラー文が表示されます。

スクリーンショット 2017-05-07 16.38.15.png

エラーメッセージについては「@group.errors.count」を用いることで「○件のエラーがあります」と表示することができる等、テクニックがまたありますが、今回はバリデーションの追加方法ということで、この辺で区切りたいと思います。