Tag: Rails/検証

目次

関連ページ

  • Rails
  • ../Bootstrap…Bootstrapを使った場合のエラーメッセージの表示方法などについて。

参考情報

概容

validatesとvalidates...ofの違い

一般的なCRUD処理時の検証の流れ

  • モデルクラスにvalidatesメソッドの追加
    class Item < ActiveRecord::Base
      validates :title, presence: true
    end
    
  • controllerクラスでの検証
  • scaffoldのデフォルト実装でも検証は行われる。
      def create
        @item = Item.new(item_params)
    
        respond_to do |format|
          if @item.save
            format.html { redirect_to @item, notice: 'Item was successfully created.' }
            format.json { render :show, status: :created, location: @item }
          else
            format.html { render :new }
            format.json { render json: @item.errors, status: :unprocessable_entity }
          end
        end
      end
    
  • ビューでは以下のようにエラーメッセージを表示する(もう少し分かりやすく表示する必要あり)
    <%= form_for(@item) do |f| %>
        <% if @item.errors.any? %>
            <div id="error_explanation">
                <h2>エラーが発生しました :</h2>
                <ul>
                    <% @item.errors.full_messages.each do |msg| %>
                        <li><%= msg %></li>
                    <% end %>
                </ul>
            </div>
        <% end %>
    
        <div class="field">
            <%= f.label :title %><br>
            <%= f.text_field :title %>
        </div>
        <div class="field">
            <%= f.label :content %><br>
            <%= f.text_area :content %>
        </div>
        <div class="actions">
            <%= f.submit %>
        </div>
    <% end %>
    
    

特別な検証

URLを検証する

エラーメッセージの表示

flash.nowとflashの違い

Bootstrap3を使う場合

../Bootstrapを参照のこと。

検証後入力値が再表示される仕組み

  • scaffoldで作成したコントローラーは以下のようになっている。
      # 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 was successfully created.' }
            format.json { render :show, status: :created, location: @item }
          else
            format.html { render :new }
            format.json { render json: @item.errors, status: :unprocessable_entity }
          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 was successfully updated.' }
            format.json { render :show, status: :ok, location: @item }
          else
            format.html { render :edit }
            format.json { render json: @item.errors, status: :unprocessable_entity }
          end
        end
      end
    
    
  • create、updateが登録後の処理となる。成功した場合はredirectして再表示、エラーの場合は入力値が設定された@itemを使ってnewやeditをrenderするので、入力値が再表示される。
  • ただし、@itemはよいのだが、値選択用のリストボックスなどの準備をnewで行っている場合それらの準備も行わないといけない(newと同様の処理)。
  • また、検証失敗後URLは以下のように変わる

Active Recordの検証機能

値の存在チェック

  • validatesで、presenceを指定
    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」の違い

  • precenseはvalidatorの一種。allow_blankは検証をスキップするという意味。
  • allow_blank: trueははformatterを指定してかつそれが空白でいい場合などに使うとよい。

PENDING

テーブル形式の入力フォームでの検証方法は?

  • fields_forを使ってテーブル形式で複数データを一気に登録できるフォームの場合、エラーが発生したフィールドをハイライト表示する方法がわからない。
  • errors.addの第1引数はフィールドのシンボルだが、fields_forの場合はどうなる?

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-06-27 (水) 14:32:19 (268d)