Help us understand the problem. What is going on with this article?

【Rails】DBのデータをビューで使用する

More than 1 year has passed since last update.

コントローラ側の処理

まず、webページでDBのデータを使用する際は、コントローラからビューにデータを渡す。
そのために、コントローラにて変数を定義する必要がある。
コントローラにてモデルからデータを受け取り、そのデータを変数に代入することでビューに引き渡すことができる。

モデルからデータを取得する例をいくつか紹介する。

テーブルごと取得する

テーブルの全データをそのまま取得する場合。
データを受け取りたいテーブルに紐づくモデルに対して、
モデル名.all

下記では、例としてmembersテーブルの中身とsongsテーブルの中身を取得してみた。

members_controller.rb
class MembersController < ApplicationController
    def index 
        @members = Member.all
        @songs = Song.all
    end
end

テーブルの中身を指定して取得する

id (主キー)を指定する

指定したidを持つレコードのデータを取得する場合、findメソッドを使用する。
モデル名.find( id )

#例 id = 1 のレコードを取得
@member = Member.find(1)

#例 id = 1,3,5 のレコードを取得
@member = Member.find(1,3,5)
members_controller.rb
class MembersController < ApplicationController
    def index 
        @member = Member.find(1)
    end
end

また、この形を応用してidをURLから取得する場合
モデル名.find(params[:id])
を使用することができる。

members_controller.rb
class MembersController < ApplicationController
    def show
        @member = Member.find(params[:id])
    end
end

例の場合で説明すると、下の画像に示したURLの赤枠部分からidを取得してきてそのidを持つレコードを受け取ることができる。
スクリーンショット 2018-08-08 0.23.29.png

id(主キー)以外の中身を指定する

主キー以外のカラムにおいて、指定した値を持つレコードのデータを取得する場合はfind_byメソッドを使用する。またfind_byメソッドはレコードを最初にヒットした1つしか取らない。
モデル名.find_by(カラム名: '値')

#例 artistの値がももいろクローバーZのレコードの中で、idが一番若いものを取得
@discography = Discography.find_by(artist: 'ももいろクローバーZ')

#例 ももいろクローバーZの曲かつ、2011年7月27日にリリースされたものでidが一番若いものを取得
@discography = Discography.find_by(artist: 'ももいろクローバーZ', released_date: '2011-07-27')

レコードの個数を指定する

レコードの個数を制限することで、idが上からn個までのレコードを取得する。
といった指定ができる。
モデル名.limit( n )

下記では、例としてidが3までのレコードを取得してみた。

members_controller.rb
class MembersController < ApplicationController
    def index 
        @members = Member.limit(3)
    end
end

カラムを指定する

指定したカラムのデータを取得する場合。
モデル名.select("カラム名")

下記では例として、membersテーブルのnameカラムの中身のみを取得してみた。

members_controller.rb
class MembersController < ApplicationController
    def index 
        @members = Member.select("name")
    end
end

ビュー側の処理

コントローラから無事ビューにデータが渡されれば、ビューでそれを表示する記述をしてあげることでやっとwebページにデータを表示することができる。
前述したどの形式のデータを渡されたかによって使い方は変わるが、
ここではテーブルごと全てのデータを取得した場合の例を載せておくので、適切な形に変えて使用すること。

指定カラムの中身を全レコード分表示

eachメソッドを使用してnameカラムの中身を全レコード分表示してみた。

views/members/index.html.erb
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="members.scss" type="text/css">
</head>
<body>
    <% @members.each do |member| %>
        <%= member.name %><br>
    <% end %>
</body>

スクリーンショット 2018-08-08 1.12.31.png

指定したフィールドの中身を表示

取得したデータから番地やカラムを指定して目的のフィールドの中身を表示してみた。
指定の仕方はリストに似ている。

下記ではsongsテーブルにおいて id = 1 のレコードからnameカラムの中身を表示した。

views/members/index.html.erb
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="members.scss" type="text/css">
</head>
<body>
    <%= @songs[0]['name'] %>
</body>

スクリーンショット 2018-08-08 1.19.26.png


以上、簡単なコントローラとビューのデータ受け渡しの書き方をまとめた。

Hal_mai
大学院生です。趣味等のアウトプットに使ってみたり。 よろしくお願いします😊
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした