Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@two_gems1256

Railsチュートリアル 第6版 振り返り 第2章

はじめに

このまとめ記事はRailsチュートリアルを1周終えた私が1周目で分からなかった所や記憶に残したい箇所のみをピックアップして記述しています。完全解説記事ではないので注意して下さい。

私と同じく2周目の方、たまに復習したいなと振り返りを行う方等におすすめです。

ユーザーのモデル設計(2.1.1)

demo_user_model.png
引用: Railsチュートリアル2.1.1図2.2

usersはデータベースのテーブル(table)

id,name,emailの属性はそれぞれテーブルのカラム(column:列)に相当する。

マイクロポストのモデル設計(2.1.2)

demo_micropost_model.png
引用: Railsチュートリアル2.1.2図2.3

マイクロポストのデータモデルの中核はユーザーよりもシンプルで、idとマイクロポストのテキスト内容を格納するtext型のcontentで構成されている。1

また、マイクロポストとユーザを関連付ける(associate)必要がある為、投稿者を記録する為にuser_idがカラムに追加されている。

ユーザのモデル設計とマイクロポストのモデル設計は後々とても重要。
この節で2つのデータベースを使ってユーザ投稿を管理している。と頭の片隅にでも覚えておくことが大事。

scaffold(スキャフォールド)(2.2)

Scaffold機能を使うとコマンドを1つ実行するだけでアプリケーションに必要なコントロールやビュー、そしてモデルを自動的に作成してくれる。 引用:Let'sプログラミング

使い方としては、rails generateスクリプトにcaffoldコマンドを渡すことで実行可能。

引数にはリソース名を単数形にして使い、必要に応じてデータモデルの属性をオプションとして追加。

$ rails generate scaffold User name:string email:string

この章では上記のコマンドを使用。

name:stringemail:stringオプションを追加することでUserモデルの内容が先程のモデル設計の内容の通りになる。

idパラメータはRailsによって自動的に主キーとしてデータベースに追加されるため不要。

データベースのマイグレード(2.2)

$ rails db:migrate

データベースに何かしらの追加、変更を行った場合は上記のコマンドを実行しなければデータベースにその内容が反映されない。

今後すごい頻度で使う為、忘れてはいけないコマンド。

MVCの挙動-1(2.2.2)

簡易的ではあるがUserリソースをscaffoldコマンドで作成したので、MVCパターンの観点からこのリソースを考察。

mvc_detailed.png
図 「/users にあるindexページをブラウザで開く」という操作をしたときの内部
引用:Railsチュートリアル2.2.2図2.11

indexアクションは全てのユーザー一覧を表示するページ。さらに詳しく確認してみる。

①ブラウザから「/users」というURLのリクエストがRailsサーバーに送信される。

② 「/users」リクエストは、Railsのルーティング機構(ルーター)によってUsersコントローラ内のindexアクションに割り当てられる。

③ indexアクションが実行され、そこからUserモデルに、「すべてのユーザーを取り出せ」(User.all)と問い合わせる。

④Userモデルは問い合わせを受け、すべてのユーザーをデータベースから取り出す。

⑤データベースから取り出したユーザーの一覧をUserモデルからコントローラに返す。

⑥Usersコントローラは、ユーザーの一覧を@users変数(@はRubyのインスタンス変数を表す)に保存し、indexビューに渡す。

⑦indexビューが起動し、ERB(Embedded RuBy: ビューのHTMLに埋め込まれているRubyコード)を実行して HTMLを生成(レンダリング)する。

⑧コントローラは、ビューで生成されたHTMLを受け取り、ブラウザに返す。

RESTアーキテクチャ

REpresentational State Transferの略。インターネットそのものやWebアプリケーションなどの、分散・ネットワーク化されたシステムやアプリケーションを構築するためのアーキテクチャのスタイルの1つ。

RailsアプリケーションにおけるRESTとは、アプリケーションを構成するコンポーネント(ユーザーやマイクロポストなど)を「リソース」としてモデル化することを指します。

これらのリソースは、リレーショナルデータベースの作成/取得/更新/削除(Create/Read/Update/Delete: CRUD)操作と、4つの基本的なHTTP requestメソッド(POST/GET/PATCH/DELETE)の両方に対応している。

引用: Railsチュートリアル2.2.2コラム2.2.

上記がRailsチュートリアル様の説明。全くもって意味が分からない。
そのため、こちらの記事を参考にさせて頂きました。

Railsを支える基本概念の整理(RESTfulやリソースなど)

この記事すごく分かりやすいです。大雑把ではありますが理解できました。
大事な所だけこの記事にも書かせて頂きます。

RESTとは、アプリケーションを構成するコンポーネント(Userなど)を、
・RDBMSのCRUD(Create/Read/Update/Delete)
・HTTPRequestの各メソッド(GET/POST/PUT/DELETE)
に対応させて、自由に作成/読み出し/更新/削除できるもの(リソース)として扱うアーキテクチャ。

ほんとに大事。この後の章にもめちゃめちゃ出てきますコイツ。

MVCの挙動-2(2.2.2)

MVCの挙動-1の例の「/users にあるindexページをブラウザで開く」をさらに深く確認。

indexアクションを確認してみる。

app/controllers/users_controller.rb
 def index
    @users = User.all
 end

このコードは「@usersと言う変数2にUserモデルからすべてのユーザーの一覧を取り出して保存」の操作を行っている。

ちなみに、Active RecordというRubyライブラリのおかげで、userモデルはuser.allというリクエストに対して応答ができている。(Active Recordについては私の記憶が正しければ後ろの章に詳しく説明されてたのでその時にまとめます。)

そして@users変数にユーザー一覧が保存されると、コントローラはindexアクションに対応しているviewを呼び出す。

app/views/users/index.html.erb
    <% @users.each do |user| %>
      <tr>
        <td><%= user.name %></td>
        <td><%= user.email %></td>
        <td><%= link_to 'Show', user %></td>
        <td><%= link_to 'Edit', edit_user_path(user) %></td>
        <td><%= link_to 'Destroy', user, method: :delete,
                         data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>

今回呼び出されたviewの中で最も注目すべきがこのコード。

<% @users.each do |user| %>@userの中のユーザー一覧が1人のデータごとにuserに代入されていく。そしてuserに代入された一1人分のデータは<% end %>までに書かれている一連の動作を行う。これが@userの中のデータが無くなるまで繰り返す。
この動作によって「/users にあるindexページをブラウザで開く」と下の様にユーザー1人1人の情報が表示される。
demo_user_index_two.png
引用: Railsチュートリアル2.2.1図2.9

validation(バリデーション)(2.3.2)

データベースの内容に制限をかける事をバリデーションと呼ぶ。

app/models/micropost.rb
class Micropost < ApplicationRecord
  validates :content, length: { maximum: 140 }
end

例えば今回のこのコード、contentに140文字の制限を付けたコードである。
これによって141文字以上のマイクロポスト投稿をしようとするとエラーメッセージが表示される様になった。
もちろんエラーが発生したのでもちろんデータベースにも登録されない。
文字制限の他にも重複ができない等、さまざまなバリデーション(制限)が今後登場する。

異なるデータモデル同士の関連付け(2.3.3)

1人のユーザーが1つのマイクロポストしかしないかと言われればそんなわけは無い。

1人のユーザーは複数のマイクロポストがあるだろう。

誰のマイクロポストかを確認するためにはUserモデルMicropostモデルを関連付けなければならない。

app/models/user.rb
class User < ApplicationRecord
  has_many :microposts
end

Userモデルに設定するのはこのコード。

1人のユーザーに複数のマイクロポストがあることを示している。

app/models/micropost.rb
class Micropost < ApplicationRecord
  belongs_to :user
  validates :content, length: { maximum: 140 }
end

Micropostモデルへの設定はこのコードになる。

1つのマイクロポストは1人のユーザーにのみ属することを示している。

この2つの関係性を図で表したものがこれ
micropost_user_association.png
引用: Railsチュートリアル2.3.3図2.16
図は流石の分かりやすさのチュートリアルさん。

micropostsテーブルにはuser_idカラムを作成してあり、これによってRailsとActive Recordがマイクロポストとユーザーを関連付けることができる様になっている。

継承の階層(2.3.4)

モデルの継承構造

UserモデルMicropostモデルはいずれも、ApplicationRecordというクラスを継承している。

そのApplicationRecordクラスは、Active Recordが提供する基本クラス ActiveRecord::Base を継承している。

このActiveRecord::Baseという基本クラスを継承したことによって、作成したモデルオブジェクトはデータベースにアクセスできるようになり、データベースのカラムをあたかもRubyの属性のように扱えるようになっているのだ。

demo_model_inheritance_4th_ed.png
引用: Railsチュートリアル2.3.4図2.19

コントローラの継承構造

コントローラの継承構造もモデルと本質的には同じ。
demo_controller_inheritance.png
引用: Railsチュートリアル2.3.4図2.20

図のように Railsのコントローラは必ずApplicationControllerを継承しているのため、Applicationコントローラで定義したルールは、アプリケーションのすべてのアクションに反映される。

継承についてまとめていると1周目の後半の章でApplicationControllerに何か定義をして様々なコントローラでその定義を使うみたいな場面があった気がした。記憶定かではないけど...

用語一覧

  • マイクロポスト

Twitterで言う"ツイート"を一般用語化した言葉。

  • HTTP(Hypertext Transfer Protocol)

WebブラウザがWebサーバと通信する際に主として使用する通信プロトコル。
引用: Wikipedia

  • ディスパッチ

ディスパッチとは、発送(する)、派遣(する)などの意味を持つ英単語で、ITの分野では同種の複数の対象から1つを選び出したり、データの送信、資源の割り当て、機能の呼び出しなどを表すことが多い。
引用: IT用語辞典 e-Words

  • マッピング

マッピングとは、地図作成、写像、対応付け、などの意味を持つ英単語。ITの分野では、ある集合の要素を何らかの規則に基づいて別の集合や要素へ対応付けたり、字義通り、要素の分布や配置を地図などの上に図示することなどを意味する。
引用: IT用語辞典 e-Words

  • コンポーネット

コンポーネントとは、部品、成分、構成要素などの意味を持つ英単語。ITの分野では機器やソフトウェア、システムの構成する部品や要素などのことを意味する。
引用: IT用語辞典 e-Words


  1. 140文字の制限で考えてみるとstring型でも十分足りるが、string型ではかなりの部分で余りが出てくる。その分text型は文字の最大長の変更が可能で増やすこともできるのでtext型が採用されている。 

  2. @記号で始まる変数をRubyではインスタンス変数と呼び、Railsのコントローラ内で宣言したインスタンス変数はビューでも使えるようになる。 

0
Help us understand the problem. What is going on with this article?
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
two_gems1256
文系Fラン大学出身の21卒エンジニア。 現在はSES勤務。働くと同時にRailsを勉強中。いつか転職したい。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?