Rails/検証
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
&tag(Rails/検証);
*目次 [#w60a64b3]
#contents
*関連ページ [#j1a32407]
-[[Rails]]
-[[../Bootstrap]]…Bootstrapを使った場合のエラーメッセージ...
-[[./基本的な流れ]]
-[[./errors.add]]
*参考情報 [#bd325948]
*基本知識 [#q53af642]
*さまざまな検証 [#x54b3ed1]
**validatesとvalidates...ofの違い [#r2bdad94]
-例えばvalidates_uniqueness_ofとvalidates :uniquenessの違...
-[[validates vs validates..._of ... · Issue #571 · bbatso...
**値の存在チェック [#q34e8f70]
-validatesで、presenceを指定
#pre{{
class Person < ActiveRecord::Base
validates :name, presence: true
end
Person.create(name: "John Doe").valid? # => true
Person.create(name: nil).valid? # => false
}}
**「precense: true」と「allow_blank: false」の違い [#bc5e...
-precenseはvalidatorの一種。allow_blankは検証をスキップす...
-allow_blank: trueははformatterを指定してかつそれが空白で...
**URLを検証する [#ude9b880]
-[[perfectline/validates_url:https://github.com/perfectli...
-[[Rails - gem validates_url 使ってみた - Qiita:http://qi...
-Gemfileに追加
gem "validate_url"
-モデルで検証
#pre{{
class User < ActiveRecord::Base
validates :homepage, url: { allow_blank: true }
end
}}
**独自の検証メソッドを呼ぶ [#x72053f0]
-ActiveModel::Validatorを継承したカスタムバリデータを作成...
#pre{{
class Invoice < ApplicationRecord
validate :expiration_date_cannot_be_in_the_past,
:discount_cannot_be_greater_than_total_value
def expiration_date_cannot_be_in_the_past
if expiration_date.present? && expiration_date < Date...
errors.add(:expiration_date, "過去の日付は使えませ...
end
end
def discount_cannot_be_greater_than_total_value
if discount > total_value
errors.add(:discount, "合計額を上回ることはできませ...
end
end
end
}}
*エラーメッセージの表示 [#f28a9229]
**flash.nowとflashの違い [#i86c54f2]
-[[[Rails] flash.now[:notice]とflash[:notice]の違い − 拝...
-flash.nowに設定されたメッセージを列挙する方法はないが(fl...
** Bootstrap3を使う場合 [#k12b3eaf]
[[../Bootstrap]]を参照のこと。
**検証後入力値が再表示される仕組み [#c4073d67]
-scaffoldで作成したコントローラーは以下のようになっている。
#pre{{
# GET /items/new
def new
@item = Item.new
end
# GET /items/1/edit
def edit
end
# POST /items
# POST /items.json
def create
@item = Item.new(item_params)
respond_to do |format|
if @item.save
format.html { redirect_to @item, notice: 'Item wa...
format.json { render :show, status: :created, loc...
else
format.html { render :new }
format.json { render json: @item.errors, status: ...
end
end
end
# PATCH/PUT /items/1
# PATCH/PUT /items/1.json
def update
respond_to do |format|
if @item.update(item_params)
format.html { redirect_to @item, notice: 'Item wa...
format.json { render :show, status: :ok, location...
else
format.html { render :edit }
format.json { render json: @item.errors, status: ...
end
end
end
}}
-create、updateが登録後の処理となる。成功した場合はredire...
-ただし、@itemはよいのだが、値選択用のリストボックスなど...
-また、検証失敗後URLは以下のように変わる
--追加初期表示時のURL: 「http://localhost:3000/items/new」
--追加失敗時のURL: 「http://localhost:3000/items」(実際は...
--更新初期表示のURL:「http://localhost:3000/items/3/edit」
--更新失敗後のURL: 「http://localhost:3000/items/3」(実際...
*PENDING [#nedcc2a6]
**テーブル形式の入力フォームでの検証方法は? [#tb678893]
-fields_forを使ってテーブル形式で複数データを一気に登録で...
-errors.addの第1引数はフィールドのシンボルだが、fields_fo...
終了行:
&tag(Rails/検証);
*目次 [#w60a64b3]
#contents
*関連ページ [#j1a32407]
-[[Rails]]
-[[../Bootstrap]]…Bootstrapを使った場合のエラーメッセージ...
-[[./基本的な流れ]]
-[[./errors.add]]
*参考情報 [#bd325948]
*基本知識 [#q53af642]
*さまざまな検証 [#x54b3ed1]
**validatesとvalidates...ofの違い [#r2bdad94]
-例えばvalidates_uniqueness_ofとvalidates :uniquenessの違...
-[[validates vs validates..._of ... · Issue #571 · bbatso...
**値の存在チェック [#q34e8f70]
-validatesで、presenceを指定
#pre{{
class Person < ActiveRecord::Base
validates :name, presence: true
end
Person.create(name: "John Doe").valid? # => true
Person.create(name: nil).valid? # => false
}}
**「precense: true」と「allow_blank: false」の違い [#bc5e...
-precenseはvalidatorの一種。allow_blankは検証をスキップす...
-allow_blank: trueははformatterを指定してかつそれが空白で...
**URLを検証する [#ude9b880]
-[[perfectline/validates_url:https://github.com/perfectli...
-[[Rails - gem validates_url 使ってみた - Qiita:http://qi...
-Gemfileに追加
gem "validate_url"
-モデルで検証
#pre{{
class User < ActiveRecord::Base
validates :homepage, url: { allow_blank: true }
end
}}
**独自の検証メソッドを呼ぶ [#x72053f0]
-ActiveModel::Validatorを継承したカスタムバリデータを作成...
#pre{{
class Invoice < ApplicationRecord
validate :expiration_date_cannot_be_in_the_past,
:discount_cannot_be_greater_than_total_value
def expiration_date_cannot_be_in_the_past
if expiration_date.present? && expiration_date < Date...
errors.add(:expiration_date, "過去の日付は使えませ...
end
end
def discount_cannot_be_greater_than_total_value
if discount > total_value
errors.add(:discount, "合計額を上回ることはできませ...
end
end
end
}}
*エラーメッセージの表示 [#f28a9229]
**flash.nowとflashの違い [#i86c54f2]
-[[[Rails] flash.now[:notice]とflash[:notice]の違い − 拝...
-flash.nowに設定されたメッセージを列挙する方法はないが(fl...
** Bootstrap3を使う場合 [#k12b3eaf]
[[../Bootstrap]]を参照のこと。
**検証後入力値が再表示される仕組み [#c4073d67]
-scaffoldで作成したコントローラーは以下のようになっている。
#pre{{
# GET /items/new
def new
@item = Item.new
end
# GET /items/1/edit
def edit
end
# POST /items
# POST /items.json
def create
@item = Item.new(item_params)
respond_to do |format|
if @item.save
format.html { redirect_to @item, notice: 'Item wa...
format.json { render :show, status: :created, loc...
else
format.html { render :new }
format.json { render json: @item.errors, status: ...
end
end
end
# PATCH/PUT /items/1
# PATCH/PUT /items/1.json
def update
respond_to do |format|
if @item.update(item_params)
format.html { redirect_to @item, notice: 'Item wa...
format.json { render :show, status: :ok, location...
else
format.html { render :edit }
format.json { render json: @item.errors, status: ...
end
end
end
}}
-create、updateが登録後の処理となる。成功した場合はredire...
-ただし、@itemはよいのだが、値選択用のリストボックスなど...
-また、検証失敗後URLは以下のように変わる
--追加初期表示時のURL: 「http://localhost:3000/items/new」
--追加失敗時のURL: 「http://localhost:3000/items」(実際は...
--更新初期表示のURL:「http://localhost:3000/items/3/edit」
--更新失敗後のURL: 「http://localhost:3000/items/3」(実際...
*PENDING [#nedcc2a6]
**テーブル形式の入力フォームでの検証方法は? [#tb678893]
-fields_forを使ってテーブル形式で複数データを一気に登録で...
-errors.addの第1引数はフィールドのシンボルだが、fields_fo...
ページ名: