0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【自分用】railsチュートリアル 2章

Last updated at Posted at 2023-04-29

やること
大量の機能を自動的に生成するscaffoldジェネレータというスクリプトを使ってtoyアプリケーション作成

2.1 アプリケーションの計画
rails newでrailsのバージョンを指定しながらアプリの骨組みを生成
$ cd ~/environment
$ rails 7.0.4 new toy_app --skip-bundle
$ cd toy_app/

リスト2.1 bundlerで扱うgemfileを編集

bundle config set --local without 'production'オプションで本番用のgemを除いたローカルgemをインストールできる
$ bundle 2.3.14 config set --local without 'production'
$ bundle 2.3.14 install
うまく動かなかったらbundle update
The dependency tzinfo-dataの警告メッセは無視して問題ない

リスト2.2 applicationコントローラにhelloアクション追加
リスト2.3 ルートルーティングを設定
リスト2.4 ローカルのwebサーバーに接続できるように

gitのバージョン管理下に置く
$ git init
$ git add -A
$ git commit -m "Add hello"

github上に新しいリポジトリ作成し、生成したファイルをプッシュする
$ git remote add origin https://github.com/<あなたのGitHubアカウント名>/toy_app.git
$ git push -u origin main

2.1.1 ユーザーのモデル設計
アプリケーションの構造を表すデータモデルを最初に設計しておく
toy_appではユーザーと短いマイクロポストのみを扱うので、UserモデルとMicropostモデルについて考えていく

図2.2 各ユーザーには、重複のない一意のキーとなるinteger型のID番号(idと呼ぶ)、一般公開されるstring型の名前(name)、string型のメールアドレスを持たせる。メールアドレスはユーザー名としても扱われる
ユーザーはテーブル、id、name、emailはテーブルのカラム(column:列)と呼ぶ

2.1.2 マイクロポストのモデル設計
マイクロポストとは短い投稿のこと
図2.3 idとtext型のcontentで構成される
しかし、ユーザーと関連付ける(associate)必要があるので投稿者を記録するためのuser_idも追加する

2.2 Usersリソース
ユーザー用のデータモデルを、そのモデルを表示させるためのwebインターフェイスに従って実装する
これらは組み合わさってUsersリソースとなり、ユーザーをHTTPプロトコル経由で自由に作成、取得、更新、削除できるオブジェクトとみなすことができるようになる

$ rails generate scaffold User name:string email:string
scaffoldコマンドの引数にはリソース名を単数形にしたもの(今回はUser)を使い、データモデルの属性をオプションとしてパラメータに追加する
name:stringとemail:stringオプションを追加
idはrailsによって自動的に主キーとしてDBに追加される

リスト2.5 rails db:migrateでDBをマイグレートする
DBを更新してusersデータテーブルを作成する

2.2.1 ユーザーページを探検する
表2.1 Usersリソースをscaffoldで生成したことでユーザー関連ページが多数追加されている
/users index すべてのユーザーを一覧するページ
/users/1 show id=1のユーザーを表示するページ
/users/new new 新規ユーザーを作成するページ
/users/1/edit edit id=1のユーザーを編集するページ

2.2.2 MVCの挙動
Usersリソースの挙動をMVC(モデル・ビュー・コントローラ)パターンから見てみる

/usersにあるindexページをブラウザで開くときの内部の挙動

  1. ブラウザから/usersというURLのリクエストをRailsサーバーに送信する(アドレスバーにURLを入力したり、リンクをクリックしたときに発生)

  2. /usersリクエストは、railsのルーティング機構(ルーター)に到達し、URLに基づいて適切なコントローラ(今回はUsersコントローラ)内のindexアクションに割り当てられる

  3. indexアクションが実行され、Userモデルに全てのユーザーを取り出せ(User.all)と問い合わせる

  4. Userモデルは問い合わせを受け、全てのユーザーをDBから取り出す

  5. DBから取り出したユーザーの一覧をUserモデルからコントローラに返す

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

  7. indexビューが起動しERB(Embedded Ruby:ビューのHTMLに埋め込まれているRubyコード)を実行してHTMLを生成する

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

リスト2.6 ユーザーからリクエストされたURLを、Usersリソースで使うコントローラのアクションに割り当てるためのコード
config/routes.rbで、URLとアクションの組み合わせを設定していく

リスト2.7 ルートからusersへのルーティング
/にアクセスするとUsersコントローラのindexアクションが実行されるようになる

リスト2.8 Usersコントローラ内のアクションの骨格

表2.2 アクションとURLとHTTPリクエストメソッド

リスト2.9 Userモデルから全てのユーザー一覧を取り出し@users変数に保存する

リスト2.10 Userモデル
継承により多くの機能が備わっている

リスト2.11 usersのindexアクションに対応しているビュー
Railsのコントローラ内で宣言したインスタンス変数はビューでも使えるようになる

2.2.3 Usersリソースの欠点
・データの検証が行われていない
このままではユーザー名が空欄でも、出鱈目なメールアドレスでも登録されてしまう
・ユーザー認証が行われていない
ログイン、ログアウトが行われていないので誰でも操作できてしまう
・テストが書かれていない
データ検証やユーザー認証など必要な要求を満たしていない
・レイアウトやスタイルが整っていない
デザインも操作方法も一貫していない
・理解が困難

2.3 Micropostsリソース
Usersリソースの次はMicropostsリソースを見ていく
UsersリソースとMicropostsリソースの構造の類似点を理解する

2.3.1 マイクロポストを探検する
scaffoldでMicropostsリソース生成
$ rails generate scaffold Micropost content:text user_id:integer

新しいデータモデルでDBを更新するには、マイグレーションを実行する
$ rails db:migrate

リスト2.12 Railsルートで使うMicropostsリソース用のルール
表2.3 MicropostsリソースのHTTPリクエストメソッド URL アクション 用途

リスト2.13 Micropostsコントローラの骨格
Usersコントローラと完全に同一

マイクロポストのインデックスページで実際にマイクロポストをいくつか作ってみる

2.3.2 マイクロポストをマイクロにする
マイクロポストに文字数制限を与えてみる
リスト2.14 最大140字にする
app/models/micropost.rb
validates :content, length: { maximum: 140 }

2.3.3 ユーザーはたくさんマイクロポストを持っている
異なるデータモデル同士の関連付けはrailsの強力な機能
今回はUserモデルとMicropostsモデルを関連づけ

リスト2.15 1人のユーザーに対し複数のマイクロポスト
app/model/user.rb
has_many :microposts

リスト2.16 1つのマイクロポストは1人のユーザーにのみ属する
app/model/micropost.rb
belongs_to :user

リスト2.17 railsコンソールでアプリケーションの状態を調べる
$ rails console

first_user = User.first
first_userに1人目のユーザーを代入

first_user
first_userを表示する

first_user.microposts
first_userの投稿を表示する

micropost = first_user.microposts.first
micropostにfirst_userに1つ目の投稿を代入

2.3.4  継承の階層
Railsのコントローラとモデルのクラス階層について

リスト2.20 2.21 図2.20 モデルの継承構造
User < ApplicationRecord < ActiveRecord::Base

リスト2.22 2.23 2.24 図2.21 コントローラの継承構造
Users < ApplicationController < ActionController::Base

2.4 最後に

2.4.1 まとめ
・scaffoldでコードを自動生成すると、Web上からデータモデルにアクセスし、やりとりできるようになる
・scaffoldは素早く開発するための機能で、学習用ではないため、scaffoldだけではrailsを理解するのは難しい
・railsでは、webアプリケーションの構成にMVC(model-view-controller)というアーキテクチャを採用している
・railsでは、HTTP requestメソッドと送信先(url)に応じて、呼び出されるコントローラやアクションが決まる
・railsでは、データのバリデーション(validation)がサポートされており、データモデルの値に制限をかけられる
・railsには、データモデル同士を関連付けするための様々なメソッド(has_manyなど)が用意されている
・railsコンソールを使うと、コマンドラインからrailsアプリを操作できる

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?