学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Ruby on RailsでWebアプリケーション開発その7 入力された値が正しいかをチェックする

<<前  [TOP]  次>>


登録フォームで入力するフィールドが空の状態であったり、正しくないデータ形式である場合にそのまま保存できてしまうと困ります。
そこで、入力された値をデータベースに保存する前にチェックします。
その仕事をするのがvalidates(バリデート)です。
validatesはモデルで定義します。


「shop」フォルダで「rails server」と入力して「Puma」を起動します。


続いて「shop」フォルダの中の「app」フォルダに進み、さらに「models」フォルダにある「good.rb」ファイルをテキストエディタで開きます。
初期状態は以下のようになっています。


【app/models/good.rb】

class Good < ApplicationRecord
end



このGoodクラスにvalidatesを実装していきます。


「validates_presence_of」を追加してみます。
「validates_presence_of」は、フィールドが空白でないかどうかをチェックするメソッドです。
記述方法は以下の通りです。
ファイルを保存するときに「UTF-8」で保存することを忘れないで下さい。


【app/models/good.rb】

class Good < ApplicationRecord

	#Railsで標準で用意されている検証メソッド
	#指定されたフィールドが存在し、その内容が空でないことを確認。
	validates_presence_of :title, :image_url, :maker, :category,
        :message => "が空の状態で保存することは出来ません。"

end

これで「title」「image_url」「maker」「category」が空の状態で保存しようとすると、「~が空の状態で保存することは出来ません」というエラーメッセージがでます。
ブラウザで「http://localhost:3000/goods」と入力して実際に確認してみます。
f:id:MrRadiology:20180130134100p:plain


次は価格が有効な数値であるかチェックします。
検証には、「validates_numericality_of」メソッドを利用します。
記述方法は、以下のようにします。


【app/models/good.rb】

class Good < ApplicationRecord

	#Railsで標準で用意されている検証メソッド
	#指定されたフィールドが存在し、その内容が空でないことを確認。
	validates_presence_of :title, :image_url, :maker, :category,
	:message => "が空の状態で保存することは出来ません。"

	#priceフィールドに数字か入力されているか検証。
	validates_numericality_of :price,
	:message => "が有効な数値ではありません。"

end

今回の場合、テーブル作成時に「price」フィールドをinteger型にしていしているので、整数以外は入力出来なくなっています。
空の状態で登録しようとするとエラーが出ます。
f:id:MrRadiology:20180130134314j:plain


priceフィールドには商品の価格が入りますので、マイナスの数字が入らないようにします。
このチェックのためにprice_validate()というメソッドを作成し、このモデルクラスに追加します。
price_validate()メソッドを使用することを「validate :price_validate」と先頭行に追加します。
「good.rb」ファイルに次のように記述を追加しましょう。


【app/models/good.rb】

class Good < ApplicationRecord

	validate :price_validate

	#Railsで標準で用意されている検証メソッド
	#指定されたフィールドが存在し、その内容が空でないことを確認。
	validates_presence_of :title, :image_url, :maker, :category,
	:message => "が空の状態で保存することは出来ません。"

	#priceフィールドに数字か入力されているか検証。
	validates_numericality_of :price,
	:message => "が有効な数値ではありません。"

	#商品の価格が正の数であることを確認する。
	#価格フィールドが空でないときだけチェックをする。
	protected
	def price_validate
		errors.add(:price, "は0より大きくなければなりません。") unless price.nil? || price > 0.0
	end

end

このprice_validate()メソッドは、保存されるときにだけ呼び出されれば良いので外部から呼び出されることは避けなければなりません。
そのため、このメソッドはprotectedで指定しました。
これでこのメソッドはこのクラスでしか利用することが出来なくなります


errors.add()には、最初のパラメータとしてフィールド名を指定します。
2番目のパラメータには、エラーとして表示させるメッセージを指定します。
さらにその後に「 unless price.nil?」として、priceフィールドが空(nil)でないかどうかを確認しています。
もし、フィールドが空であればこの検証は行われません。
さらに論理演算記号の「||」で記述をつなげ、「price > 0」として価格が0より大きな値であることを指定しています。


f:id:MrRadiology:20180130134624j:plain


登録される商品の名前が重複して登録されないようにします。
名称重複の検証は「validates_uniqueness_of」メソッドを利用します。


【app/models/good.rb】

class Good < ApplicationRecord

	validate :price_validate

	#Railsで標準で用意されている検証メソッド
	#指定されたフィールドが存在し、その内容が空でないことを確認。
	validates_presence_of :title, :image_url, :maker, :category,
	:message => "が空の状態で保存することは出来ません。"

	#priceフィールドに数字か入力されているか検証。
	validates_numericality_of :price,
	:message => "が有効な数値ではありません。"

	#titleフィールドに保存しようとする名称が存在していないかどうかを確認。
	validates_uniqueness_of :title,
	:message => "はすでに存在しています。"

	#商品の価格が正の数であることを確認する。
	#価格フィールドが空でないときだけチェックをする。
	protected
	def price_validate
		errors.add(:price, "は0より大きくなければなりません。") unless price.nil? || price > 0.0
	end

end



f:id:MrRadiology:20180130134928j:plain


今度は正規表現を利用した検証を行います。
「image_url」が「.jpg」「.png」「.gif」のどれかで終わっているかどうかを確認します。
これには「validates_format_of ()」メソッドを利用します。


【app/models/good.rb】

class Good < ApplicationRecord

	validate :price_validate

	#Railsで標準で用意されている検証メソッド
	#指定されたフィールドが存在し、その内容が空でないことを確認。
	validates_presence_of :title, :image_url, :maker, :category,
	:message => "が空の状態で保存することは出来ません。"

	#priceフィールドに数字か入力されているか検証。
	validates_numericality_of :price,
	:message => "が有効な数値ではありません。"

	#titleフィールドに保存しようとする名称が存在していないかどうかを確認。
	validates_uniqueness_of :title,
	:message => "はすでに存在しています。"

	#フィールドの値が正規表現に一致するかどうかをチェック。
	#.gif,.jpg,.pngのどれかで終わっていることを確認。
	validates_format_of :image_url,
	:with => /\a|\.jpg$|\.png$|\.gif$\z/,
	:message => "はGIF,JPG,PNG画像でなければなりません。"

	#商品の価格が正の数であることを確認する。
	#価格フィールドが空でないときだけチェックをする。
	protected
	def price_validate
		errors.add(:price, "は0より大きくなければなりません。") unless price.nil? || price > 0.0
	end

end

正規表現は「:with」パラメータに渡します。

:with => /\a|\.jpg$|\.png$|\.gif$\z/,

「/」~「/」の間に正規表現の記述をします。
「\a」は「行頭」、「\z」は「行末」を意味しています。
「|」はいずれかの文字という意味です。


f:id:MrRadiology:20180130135331j:plain


<<前  [TOP]  次>>