AR삽질러

Rails 一日一つメソッド (Day3) all, find_dy, renderメソッド 본문

Ruby/RubyOnRails-日本語

Rails 一日一つメソッド (Day3) all, find_dy, renderメソッド

아랑팡팡 2023. 12. 23. 13:45
728x90

 

Rails 一日一つメソッド (Day3) all, find_dyメソッド, render

 

1. allメソッドとは

 - allメソッドはActiveRecordモデルによって使用される。該当するTableのすべてのRecordを呼び出せる役割としてすべての列(Row)を検索し、各列に対するObjectの配列を返す。

allメソッドの使用方法
allメソッドの使用方法 allメソッドを呼び出す。 User.all : usersテーブルのすべてのRecordを返す。
チェーン  allで返された 'ActiveRecord::Relation' オブゼダートに追加のクエリメソッド をチェーンできる。 User.all.order(:name) はすべての使用者を名前順番で整列 する。
クエリ組み合わせ allメソッドをほかのメソッドを使ってもっと複雑なクエリを作る。 User.all.where(active: true).limit(10)
活性化されたユーザの中で10個のRecordの返す。
結果処理 allで持ってきたRecordに対して反復作業ができる。 User.all.each { |user| puts user.name |
すべてのユーザーの名前を出力する。

 

allメソッドの注意

 - 大きいデータでは 'all' の代わりに 'find_each', 'find_in_batches' 'select' 'where を使う。

 

UsersController

class UsersController < ApplicationController
    def index
        @users = User.all
    end

 - 'index' アクションは、'User' Modelと関係するすべてのRecordをDabaBaseから持ってくる。

 - 'User.all' はDabaBaseの 'users' テーブルに存在するすべてのユーザーを検索する。

 - ActiveRecord:Relation : 'User.all' は 'ActiveRecord:Relation' オブゼダートを返す。これはDabaBaseクエリに接近する時に実行される。(Lazy Loading )

 - インスタンス変数@users : '@users' インスタンス変数に検索されたすべてのユーザーが保存される。

 

routes.rb

Rails.application.routes.draw do
  get 'users', to: 'users#index'

 - URL経路 : usersを 'UsersController' の’index' アクションにMappingし、ユーザーがブラウザで 'http://usersに移動すると 'index'アクションが実行される。

 

index.rb

<h1>登録されている Users</h1>

<table>
  <thead>
    <tr>
      <th>ID</th>
      <th>Name</th>
      <th>Email</th>
    </tr>
  </thead>
  <tbody>
    <% @users.each do |user| %>
      <tr>
        <td><%= user.id %></td>
        <td><%= user.name %></td>
        <td><%= user.email %></td>
      </tr>
    <% end %>
  </tbody>
</table>

 - UsersController 'index' アクションの設定された @usersインスタンス変数を使ってすべてのユーザーRecordを表す。

 


 

2. find_byメソッドとは

 - ActiveRecordに使われ、特定の条件に一致するRecordを検索する。

 - 特定の条件を満足する最初のRecordを探す時に使う

find_byメソッドの特徴
条件ベース検索 一つ以上の条件でRecordを検索する。 User.find_by(id: 1)
idが 1のUserオブジェクトを探す。
単一オブジェクトリターン 条件を満足する最初のオブジェクトを返し、その条件がない場合は、nilを返す。  
クエリ最適化 find_byは必要なDataだけ持ってくる。  

 

find_byメソッドの注意

 - 条件がない場合 'nil' を返すので、返されるオブジェクトが 'nil' かどうかを確認するロジックが実装する方がいい。

 - find_byと似たように作動するfind_by!メソッドもある。 find_by!は条件に合うレコードがない場合、Active Record::Record Not Found例外を発生する。これは主に例外処理が必要な状況で使われる。
 - find_byは条件に合う最初のレコードのみを返すので、 複数のレコードを返すには、whereメソッドを使う方がいい。

 

UsersController

class UsersController < ApplicationController
    def user_search
        if params[:name].blank?
            flash.now[:alert] = '入力してください。'
            render 'user_search'
        else
            @user = User.find_by(name: params[:name])
    
            if @user.nil?
                flash.now[:alert] = 'そのユーザーは存在しません。'
                render 'user_search'
            else
                render 'user_show'
            end
        end
    end

 - user_searchアクションで params[:name]で入力されたユーザを探し一致するユーザーがない場合は、'nil' を返す。

 - ユーザーがある場合は 'user_show' viewをレンダリングしない場はエラーメッセージとuser_search View をレンダリングする。

 

routes.rb

Rails.application.routes.draw do
  get 'user_search', to: 'users#user_search', as: 'user_search'
end

 - user_searchはUserControllerのuser_searchアクションにMappingされ検索機能を使う時に呼び出す。

 

user_search.html.erb

<!-- app/views/users/user_search.html.erb -->
<h1>User 検索</h1>

<%= form_with url: user_search_path, method: :get do |form| %>
  <div>
    <%= form.label :name, "User Name:" %>
    <%= form.text_field :name, placeholder: "Enter User Name" %>
  </div>
  <br>
  <div>
    <%= form.submit "検索" %>
  </div>
<% end %>

<% if flash[:alert] %>
  <p><%= flash[:alert] %></p>
<% end %>

 - ユーザーが入力したら 'user_search' アクションの 'params[:name]' を受けて入力された名前を伝わる。

show.hrml.erb

<!-- app/views/users/user_show.html.erb -->
<h1>User 情報</h1>

<p>
  <strong>ID:</strong>
  <%= @user.id %>
</p>

<p>
  <strong>Name:</strong>
  <%= @user.name %>
</p>

<p>
  <strong>Email:</strong>
  <%= @user.email %>
</p>

 - 'user_search' アクションで探した '@user' オブジェクトの情報を表示する。

 

findメソッドとfind_byメソッドの違い

 - findメソッドは 'ID'に基づいた検索に使われ、色んなRecordを返すことができる。その反面、'find_by'は与えられた条件によって一致する単一Recordだけを返す。

find Method
IDを基準に検索する。
単一IDを渡すと一致するIDを持っているすべてのRecordを返す。

find_by Method
与えられた条件(ID、名前、Email等々)を満足する最初のRecordを検索する。
条件に一致するRecordがいくつかあっても最初の一つだけを返す。

 

 


3. renderとは

 - 'render'はControllerで使われViewテンプレートをRenderingしたり応答を直積生成する時に使われる。

 

class UsersController < ApplicationController
    def user_search
        if params[:name].blank?
            flash.now[:alert] = '入力してください。'
            render 'user_search'
        else
            @user = User.find_by(name: params[:name])
    
            if @user.nil?
                flash.now[:alert] = 'そのユーザーは存在しません。'
                render 'user_search'
            else
                render 'user_show'
            end
        end
    end

 

1. user_searchアクションでの 'render'

 a) ユーザーがない場合

ユーザーが何も入力しなかった場合、'render user_search'を呼び出す。これは 'user_search.html.erb' ViewテンプレートをRenderingしユーザーに予め入力を要請したりエラーメッセージを表紙する。

 

 b) 検索されたユーザーがいる場合
検索されたユーザーがいる場合は、render 'user_show' を呼び出し、user_show.html.erbビューテンプレートをレンダリングする。 これは、ユーザーが検索したユーザーの詳細を示している。

 


https://github.com/designAR/rails_method_study/tree/day03

 

GitHub - designAR/rails_method_study

Contribute to designAR/rails_method_study development by creating an account on GitHub.

github.com

 

728x90
반응형
LIST