すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Rails

【Rails】 findメソッドを使って指定したレコードを取得しよう!

ぴっかちゃん
ぴっかちゃん

findメソッドは、引数で指定したidのレコードを1件だけ取得するメソッドです。

以下のように記述すると、usersテーブルのidが1のレコードを取得し、userという変数に代入します。

コントローラー | findメソッドの基本構文
1
2
 # モデル名.find(取得したいレコードのid)
user = User.find(1)

上記のコードを実行すると、以下のようにusersテーブルのidが1のレコードを取得することが出来ました。

findメソッド

もし、そのidに当たるレコードがない場合はエラーが発生します。

findメソッドの使い方

この章では、findメソッドの使い方について解説します。

どのような時に使うのか

それではこのfindメソッドはどのような時に使うのでしょうか?
直接取得したいテーブルを指定できるので、編集や削除したいレコードを取り出す際や、詳細ページを表示したい時に使います。

findメソッドを使うにはまずidを取得する必要があります。
なぜならfindメソッドの引数にはidしか指定できないためです。
下記のようにルーティングを設定している場合のidの取り出し方はこのような形になります。

routes.rb
1
2
3
4
5
6
7
# ルーティング
get   'users/:id'   =>  'users#show'

# コントローラー
def show
  @user = User.find(params[:id])
end

showアクションなどで使う場合、引数で指定するidはparamsで取得します。
上のようなルーティングの時、users/:id:idの部分がキーとなり、urlでその部分に入った文字がバリューとなります。

:idの部分は任意の文字で大丈夫ですが、わかりやすい名前にしておきましょう。
ここではresourcesメソッドを使った時に自動で作成されるルーティングをもとに書いてあります。
(例)localhost:3000/users/3

上の例の場合は「3」が 「:id」のバリューとなるので {id: 3} という形で次のアクションへと渡されます。

このようなパスで送られたパラメータもparamsで取り出すことができます。
showアクション内では「3」という数値が欲しいので params[:id]という形で取り出しているわけです。

実際のアプリで使ってみよう

それではrailsのファイルを使って実際にfindメソッドを使ってみましょう。
下記のコマンドを順に実行してみましょう。

①git clone -b find https://github.com/miyagit/programan_dojo.git

② cd programan_dojo

③ bundle install
→ rbenv: version ‘2.4.1’ is not installed と表示された場合は、ruby -v と実行してください。

ruby -vと実行し出てきたversion(例: 2.3.1)と出てきたら、

vim .ruby-versionとし、
ruby -vで出てきた値(例: 2.3.1)に書き換えてください。

続いてvim Gemfileとし、ruby 2.4.1と書いてある部分をruby -vで出てきた値(例: 2.3.1)に書き換えてください。

④ rails db:create && rails db:migrate && rails db:seed

環境構築が完了しました。と表示されると、
本当にrails applicationが動作するかrails sコマンドで起動しましょう。

rails sを起動し、ブラウザでlocalhost: 3000と入力して下記のような画面が出てくれば環境構築完了です!

環境構築

コントローラーを編集してみよう

programan_dojo/app/controllers/users_controller.rb
上記のファイルを開けて下記のようにshowアクションを定義しましょう。

users_controller.rb
1
2
3
4
5
class UsersController < ApplicationController
    def show
        @user = User.find(params[:id])
    end
end

ビューファイルを編集しよう

次にapp/views/users以下にshow.html.erbというファイルを作成しましょう。
/Users/yuya/Desktop/programan/programan_dojo/app/views/users/show.html.erb
作成したファイルを編集します。

@userをこちらのビューファイルで使うことが出来るので、展開して表示させてみましょう。
作成したファイルを下記のように編集してください。

show.html.erb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<div class='p-top'>
  <table border="1" class= 'p-top__introduce'>
    <tr>
    <th>名前</th>
    <th>年齢</th>
    <th>身長</th>
    <th>体重</th>
    </tr>
    <tr>
      <td><%= @user.name%></td>
      <td><%= "#{@user.age}歳" %></td>
      <td><%= "#{@user.tall}cm" %></td>
      <td><%= "#{@user.weight}kg" %></td>
      </tr>
  </table>
</div>

ビューを表示させてみよう

次にrails sでサーバーを立ち上げ、下記のアドレスを表示させてみましょう。
http://localhost:3000/users/1

下記のように表示されましたでしょうか?

rails s

このようにidが「1」のユーザーの詳細が表示できました。
次に上のアドレスの「1」の部分を「2」に変更し、表示させてみましょう。

findメソッド

今度はidが「2」のユーザーの詳細が表示されました。
これを「3」に変えればidが「3」のユーザーの詳細が表示されます。
存在しないidの数値を入力した際はエラーが発生します。

流れを確認してみよう

それでは今回の流れを確認してみましょう。

まずルーティングを確認します。
rails routesコマンドをターミナルで打ってみましょう。
すると下記のように表示されるはずです。

ターミナル | rails routesの結果 -->
1
2
3
4
5
6
7
8
9
10
11
      Prefix  Verb        URI Pattern                          Controller#Action
         root  GET         /                                            main#top
       users  GET         /users(.:format)                  users#index
                   POST      /users(.:format)                  users#create
new_user  GET         /users/new(.:format)         users#new
edit_user  GET         /users/:id/edit(.:format)    users#edit
         user  GET         /users/:id(.:format)             users#show
                   PATCH   /users/:id(.:format)             users#update
                   PUT        /users/:id(.:format)             users#update
                   DELETE  /users/:id(.:format)             users#destroy
#以下省略

今回はusersコントローラーのshowアクションを動かしたいので7行目をみます。
するとshowアクションを動かすURIは/users/:idということがわかりますね。
:idの欄にはURIで記述した数字が入ります。
するとshowアクション内でparams[:id]という形でURIの中に書いたidを取得できます。

上の例だと「users/1」と書いたときは「1」がparamsに入り、showアクションではUser.find(params[:id])となっているのでUser.find(1)となり、idが1のレコード@userという変数に代入されました。
この@usershow.html.erbで展開することによりidが1のユーザーの詳細が表示できたというわけです。

実際のアプリで使ってみるとよく理解できますね!Ruby on Railsから学んでいる方も多いかと思いますが、こちらのチェリー本と呼ばれる参考書でRubyの基礎をおさえると学習スピードも早くなりますよ!

この記事のまとめ

  • findメソッドは、引数に指定したidのレコードを1件だけ取得するメソッド
  • idに指定したレコードがない場合はエラーが発生するので注意!
  • 送信されるパラメータのidを引数に入れてレコードを取得することも出来る