LoginSignup
38
52

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-07

バリデーション(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」を用いることで「○件のエラーがあります」と表示することができる等、テクニックがまたありますが、今回はバリデーションの追加方法ということで、この辺で区切りたいと思います。

38
52
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
52