メモランダム Rails tutorial　第2章

# Rails tutorial　第2章
#Toyアプリケーション
#便利なスクリプト：scaffoldジェネレータ
- 概要を素早く掴むため。
Railsアプリの構造と推奨のRESTアーキテクチャについて考察。

#1. アプリケーションの計画
## アプリケーションの骨組み 
- rails new バージョン番号指定　gemfileの編集。
- --without productionオプションを追加することで、本番用のgemを除いたローカルgemをインストール。
- Gitでバージョン管理下に置く。int, add -A, commit -m。 
- bitbucketで新しいレポジトリの作成。ファイルをプッシュ。
- コントローラ、ルーティングの設定。Herokuにプッシュ。
- twiiterのようなマイクロポストを作成する予定。ユーザーモデルそしてマイクロポストモデルを作成する。

##ユーザーのモデル設計
- id-integer, name-string, email-string
- users = table, id, name, email, = column

##マイクロポストのモデル設計
- id-integer, content-text, user_id-integer
-- user_idは関連づけassociateするため。

#2. Usersリソース
- $ rails generate scaffold User name:string email:string
-- idは自動で追加のため操作不要。
- $ rails db:migrate 、migrate = 移動するさせる
-- データベースの更新、usersデータモデル作成のため
-- Rails5以前はrakeコマンドだったので注意。
- rails server ローカルサーバー起動　結果を必ず確認。
- users各種アクション　index, show, new ,edit
- MVCの挙動
-- ex.[usersのindexページを開く」　
--- ブラウザからルーターへ（アクション割り当て(ディスパッチ））
--- コントローラー（アクション実行）
--- モデル（データベースからデータ取り出し、コントローラに返す）
--- コントローラー（インスタンス変数@users)に保存。ビューへ。
--- ビュー(HTML生成（レンダリング））
--- コントローラーはブラウザに返す。
- RESTアーキテクチャ
-- index、show、new、editに加えてcreate、update、destroy（ページを出力せずにデータベース上のユーザー情報を操作するもの）をたす。
--  REpresentational State Transfer (REST)
--- RailsアプリケーションにおけるRESTとは、アプリケーションを構成するコンポーネント (ユーザーやマイクロポストなど) を「リソース」としてモデル化することを指す。
-- @users = User.allという行 = Userモデルからすべてのユーザーの一覧を取り出し、@usersという変数に保存する。

## Usersリソースの欠点
- データの検証が行われていない
- ユーザー認証が行われていない
- テストが書かれていない
- レイアウト・スタイルが整っていない。
- 理解が困難。

# 3. Micropostsリソース
- Usersリソースとの類似点を理解することが大事。

## Micropostsリソースもscffoldでコードを作成。
-  rails db:migrate でデータベースを更新。
-  resources :microposts はマイクロポスト用のURIをMicropostsコントローラ内のアクションに割り当てる。

### validates :content, length: { maximum: 140 }で文字制限を与える。
　
### 人のユーザーに複数のマイクロポストがある。 = has_many :microposts

### 1つのマイクロポストは1人のユーザーにのみ属する。 = belongs_to :user

## Railsのconsoleは、Railsアプリケーションを対話的に操作することができる便利なツール、

### マイクロポストのコンテンツが存在しているかどうかの確認 =
  presence: true

### Userモデルに存在性のバリデーションを追加する = 
- validates FILL_IN, presence: true    # 「FILL_IN」をコードに置き換えてください
- validates FILL_IN, presence: true    # 「FILL_IN」をコードに置き換えてください

##　継承の階層
- UserモデルとMicropostモデルはいずれも、ApplicationRecordというクラスを継承している。
- ApplicationRecordクラスは、Active Recordが提供する基本クラス ActiveRecord::Base を継承している（このActiveRecord::Baseという基本クラスを継承したことによって、作成したモデルオブジェクトはデータベースにアクセスできるようになり、データベースのカラムをあたかもRubyの属性のように扱えるようになる）。

### コントローラの継承構造も、モデルの継承構造と本質的には同じ

## アプリケーションをデプロイする
- ポジトリをBitbucketに登録
- $ git status
- $ git add -A
- $ git commit -m "Finish toy app"
- $ git push

- Herokuに展開するなら　$ git push heroku
- アプリケーションのデータベースを動作させるためには　heroku run rails db:migrate

# 最後に
## 良い
- Rails全体を高度なレベルで概観できた
- MVCモデルを紹介できた
- RESTアーキテクチャに初めて触れた
- データモデルの作成を初めて行った
- データベースを背後に持つWebアプリケーションを本番環境で動かした

## 弱点

- レイアウトもスタイルも設定されていない
- “Home” や “About” のような定番の静的なページがない
- ユーザーがパスワードを設定できない
- ユーザーが画像を置けない
- ログインの仕組みがない
- セキュリティのための仕組みがまったくない
- ユーザーとマイクロポストの自動関連付けが行われていない
- Twitterのような「フォロワー (following)機能」や「フォロー中 (followed)機能」がない
- マイクロポストをフィードできない
- まともなテストがない
- 理解が困難

## 今後はこの弱点を一つずつ克服していく。

# まとめ
- Scaffold機能でコードを自動生成すると、Webのあらゆる部分からモデルデータにアクセスしてやりとりできるようになる
- Scaffoldは何よりも手っ取り早いのがとりえだが、これを元にRailsを理解するには向いていない
- RailsではWebアプリケーションの構成にMVC (Model-View-Controller) というモデルを採用している
- Railsが解釈するRESTには、標準的なURLセットと、データモデルとやりとりするためのコントローラアクションが含まれている
- Railsではデータのバリデーション (validation) がサポートされており、データモデルの属性の値に制限をかけることができる
- Railsには、さまざまなデータモデル同士を関連付けを定義するための組み込み関数が多数用意されている
- Railsコンソールを使うと、コマンドラインからRailsアプリケーションとやりとりすることができる