Help us understand the problem. What is going on with this article?

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away