LoginSignup
145
119

More than 5 years have passed since last update.

Model.find(params[:id]) を丁寧に調べた(Rails入門)

Last updated at Posted at 2018-06-05

はじめに

Rails製のWebアプリケーションの中で、Controllerファイル内でよく見る

def show
  @instance = Model.find(params[:id])
end

こういうやつ。いままで、何の気なしに書いてみましたが、断片的な知識をまとめたらいろんな気づきがあったので、丁寧に調べたことを書いて行きます。結構当たり前な内容なので、本記事対象者は最近Railsをはじめた人向けです。

上のコードの概要

これに関して、色々な疑問が湧いたので、それについて調べてみました。

なぜ@を先頭に付けたものに代入するのか

まず、代入されているものはインスタンス変数です。

では、なぜインスタンス変数は、先頭に@をつけるかというと、ruby言語文法の決まりで、インスタンス変数は先頭は@から始める約束ごとなので、としか言えません。

なぜインスタンス変数に代入するのか

ではなぜ、普通の変数ではなく、インスタンス変数に代入するのかというと、インスタンスメソッドを利用したいからだと思います(他にも様々な理由はあると思います)。インスタンス変数を経由することでControllerからViewへ変数を渡すことができます。

今回のインスタンス変数に代入されているデータは、イコール(=)の右側を見ればわかりますが、モデルのインスタンスです。モデルのインスタンスとは、1つのオブジェクト、またはデータベースの一つのレコードと言い換えてもいいかもしれません。

あまり関係ないデータですが、Rails consoleを使用して、あるモデル(Message)の、ある1つのオブジェクトをみて見ると以下のようになります。

> Message.find(2)
  Message Load (0.3ms)  SELECT  `messages`.* FROM `messages` WHERE `messages`.`id` = 2 LIMIT 1
 => #<Message id: 2, content: "samlple1", created_at: "2018-06-04 03:28:06", updated_at: "2018-06-04 03:28:06"> 

下記が、1つのオブジェクトであり、データベースの一つのレコードと言い換えてもいいかものやつです。

#<Message id: 2, content: "samlple1", created_at: "2018-06-04 03:28:06", updated_at: "2018-06-04 03:28:06">

インスタンス変数に代入する理由に戻りますが、例えば、このコントローラーのアクションに対応するViewで上記のオブジェクトを、部分的にでも使いたいとします。そんな時に、メソッドを使用すれば簡単に使えるのでインスタンス変数を用いるのだと思います。

findとは

findはモデルの検索機能を持つメソッドです。モデルと紐づいているデータベースのテーブルから、レコードを1つ取り出す場合に、findメソッドを使います。

paramsとは

paramsとはRailsで送られてきた値を受け取るためのメソッドです。送られてくる情報(リクエストパラメータ)は主に、getのクエリパラメータとPostでformを使って送信されるデータの2つです。

params[:カラム名]

で値を受け取ることができます。

コロン記号(:)について

コロン記号(:)はシンボルの意味です。シンボルはオブジェクトの一つで、ハッシュのキーとしてよく使用されます。シンボルのメリットとして、メモリを消費せず、可読性があがり、処理が高速になる。

以上です。ありがとうございました。

参考

145
119
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
145
119