更新日:
【Rails】 findメソッドを使って指定したレコードを取得しよう!
findメソッドは、引数で指定したidのレコードを1件だけ取得するメソッドです。
以下のように記述すると、usersテーブルのidが1のレコードを取得し、userという変数に代入します。 
1
2
 # モデル名.find(取得したいレコードのid)
user = User.find(1)
上記のコードを実行すると、以下のようにusersテーブルのidが1のレコードを取得することが出来ました。

もし、そのidに当たるレコードがない場合はエラーが発生します。
findメソッドの使い方
この章では、findメソッドの使い方について解説します。
どのような時に使うのか
それではこのfindメソッドはどのような時に使うのでしょうか? 
直接取得したいテーブルを指定できるので、編集や削除したいレコードを取り出す際や、詳細ページを表示したい時に使います。
findメソッドを使うにはまずidを取得する必要があります。 
なぜならfindメソッドの引数にはidしか指定できないためです。 
下記のようにルーティングを設定している場合のidの取り出し方はこのような形になります。
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アクションを定義しましょう。
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をこちらのビューファイルで使うことが出来るので、展開して表示させてみましょう。 
作成したファイルを下記のように編集してください。
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
下記のように表示されましたでしょうか?
このようにidが「1」のユーザーの詳細が表示できました。 
次に上のアドレスの「1」の部分を「2」に変更し、表示させてみましょう。
今度はidが「2」のユーザーの詳細が表示されました。 
これを「3」に変えればidが「3」のユーザーの詳細が表示されます。 
存在しないidの数値を入力した際はエラーが発生します。
流れを確認してみよう
それでは今回の流れを確認してみましょう。
まずルーティングを確認します。 
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という変数に代入されました。 
この@userをshow.html.erbで展開することによりidが1のユーザーの詳細が表示できたというわけです。
実際のアプリで使ってみるとよく理解できますね!Ruby on Railsから学んでいる方も多いかと思いますが、こちらのチェリー本と呼ばれる参考書でRubyの基礎をおさえると学習スピードも早くなりますよ!
この記事のまとめ
- findメソッドは、引数に指定したidのレコードを1件だけ取得するメソッド
 - idに指定したレコードがない場合はエラーが発生するので注意!
 - 送信されるパラメータのidを引数に入れてレコードを取得することも出来る