【Rails】XX件以上登録できないようにする独自バリデーションメソッドを設定する方法
こんばんは。opiyoです。
Railsアプリで「XX以上は登録できない!」というバリデーションを設定したかったので、やり方を調べてみました。
やりたいこと
Keyword
というテーブルにデータを登録する処理で、5つまでしか登録できないようにバリデーションを設定します。
もし5つ以上の登録を行おうとした場合はsave
でエラーになるようにします。
Model
class Keyword < ApplicationRecord validates :title, presence: true validates :url, presence: true validate :check_count def check_count errors.add(:keyword, "は5つまで登録可能です。") if Keyword.count >= 5 # errors.add(:keyword, "は5つまで登録可能です。") if Keyword.where(user_id: self.user_id).count >= 5 end end
モデルにバリデーションメソッドを定義します。
validate
にメソッド名を記述し、そのメソッド内でKeyword
の件数を取得しif
文を記述します。
もし5件以上あれば、errors
の中に名前とエラーメッセージを追加します。
またコメントアウトしている部分ですが、self
を使うことで自分が登録したデータのみを対象とすることが出来ます。こうやって使うことが基本になりそうですね。
また、errors
の正体についてはActiveModel::Errors
で詳細はこちらを。
Controller
class KeywordsController < ApplicationController def create @keyword = Keyword.new(keyword_params) @keyword.check_count if @keyword.save redirect_to root_url else render 'new' end end private def keyword_params params.require(:keyword).permit(:title, :url) end end
コントローラーではKeyword
をインスタンス化して、メソッドを呼び出すだけです。
5件以上ある場合はerrors
にエラーが追加されているので、save
する時に失敗します。
という流れです。