【Rails】findメソッドを徹底解説!

Rails

findメソッドとは

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

findメソッドの構文
リンクをコピーしました

ruby
1
user = User.find(1) #<-モデル名.find(取得したいレコードのid)

上のように記述するとusersテーブルのidが1のレコードを取得し、userという変数に代入します。
もしそのidに当たるレコードがない場合はエラーが発生します。

findメソッド
このようにusersテーブルのidが1のレコードが取り出されました。

どのような時に使うのか
リンクをコピーしました

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

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

ruby
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アクションを定義しましょう。

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

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の数値を入力した際はエラーが発生します。

流れを確認してみよう
リンクをコピーしました

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

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

shell
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という変数に代入されました。
この@userをshow.html.erbで展開することによりidが1のユーザーの詳細が表示できたというわけです。

実際のアプリで使ってみるとよく理解できますね!

まとめ

findメソッドは引数に指定したiのレコードを1つだけ取得するメソッドです。
主にshowアクションやedit、destroyアクションなどで使用します。