Ruby on Rails_学習1

## Ruby on Rails
- Ruby on RailsとはRuby言語で記述されたWeb開発フレームワークです。

#### 投稿目的
- 個人的な学習のために投稿しています。
- 暖かい目で閲覧していただけると幸いです。

## Railsインストール

### RubyGems
- RubyGemsというパッケージ管理システムがありgemコマンドで利用することができます。

### Railsのインストール
- ターミナル上でgemコマンドとinstall railsでインストールすることができます。

```shell:ターミナル
$ gem install rails 
```

- オプションに -v を付ける事でインストールするバージョンを指定することができます。

```shell:ターミナル
$ gem install rails -v バージョン
```

## ディレクトリ、ファイル構成
- [rails new ディレクトリ名] で自動でディレクトリ、ファイルを作成してくれます。

```shell:ターミナル
$ rails new hello_app
 ```
 [上記: 実行後](https://i.gyazo.com/245f1886b943c05d6e1a90c6637bf0d3.png) 
 [ディレクトリ用途](https://i.gyazo.com/3d710db4524cd4a5e28f1d45e1692213.png)

- ディレクトリ、ファイル構造がすべてのRailsアプリで標準化されているおかげで、Railsのコードが読みやすくなります。これはWebフレームワークを導入する大きなメリットです。

### bundle install
- Gemfileのgem 'ライブラリ名'で記述されたライブラリをインストールするのでターミナルでbundle installを実行するのですがRailsの場合Rails new を実行した際にbundle installも自動で行われます。

## railsローカルサーバーを起動
- rails serverを利用することでrailsのローカルサーバーを起動することができる。

```rails
$ rails server
```

## Model-View-Controller (MVC)
- appディレクトリにmodel、view、controllerの3つのサブディレクトリが存在します主にこの3つでGUIの構成が行われています。
- MVCは3層に分けたアーキテクチャ。

#### Model(モデル)
- ビジネスロジックの実行
- データの操作

#### View(ビュー)
- ユーザからの画面入力
- ユーザへの結果出力
- Model のデータの状態を参照して画面に表示

#### Controller(コントローラ)
- 入力情報を受取る
- 処理を行う Model と結果を返す View を選定
- 司令塔的存在

- ブラウザからWebサーバーにリクエストを送信し、処理する役割を担っているcontrollerに渡され、controllerは場合によってはすぐview を生成してHTMLをブラウザに送り返します。動的なサイトでは、一般にcontrollerはデータベースとの通信を担当しているmodelを呼び出した後、controllerは、viewを描画し、完成したWebページをHTMLとしてブラウザに返します。

```rails:application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  # hello関数を定義
  def hello
      # 処理内容は'hello, world!'と表示
    render html: 'hello, world!'
  end
end
```

## Router(ルーター)
- ルーターとはブラウザとサーバーの間に存在するものでリクエストをコントローラに振り分ける役割を果たします。

- routesファイルを編集することでルーターを操作することができます。

```rails:routes.rb
Rails.application.routes.draw do
  # アクセスする際のルートを設定
  root 'application#hello'
end
```

## toyアプリを作成
- ツイッターみたいなのを作成します。
    - ユーザー登録と投稿機能
     
### scaffold
- scaffold = 足場(枠組み).
- scaffoldジェネレータというスクリプトを使ってアプリケーションをすばやく生成することができます。
- scaffoldはRailsアプリケーションの概要を素早くつかむには最適なのでtoyアプリはscaffoldを利用していきます。

### モデル設計
- ユーザーという概念をデータモデルで表す方法。
    - ユーザーのデータモデルの概要
        - モデル名はusersで各ユーザーには、重複のない一意のキーとなるinteger型のid(ID)を割り当て、このIDに加えて公開されるstring型のname(名前)そして同じくstring型のemail(メール)を持たせます。
        - usersがデータベースのテーブルでまたid、name、emailの属性はそれぞれテーブルのカラムに相当します。
    - マイクロポストのモデルの概要
        - マイクロポストのデータモデルはモデル名はmicroposts、idとテキスト内容を格納するtext型のcontentだけで構成されています。
        - しかし、micropostsをusersと関連付ける必要がありマイクロポストの投稿者を記録するためのuser_idも追加します
        - user_idという属性はSQLでいうJoinするために必要な役割です。

### Usersリソース
- ユーザー用のデータモデルを、そのモデルを表示するためのWebインターフェイスに従って実装します。
    - このデータモデルとWebインターフェースは、組み合わさってUsersリソースとなり、ユーザーというものを、HTTPプロトコル経由で自由に作成/取得/更新/削除できるオブジェクトとみなすことができるようになります。
    - このUsersリソースはすべてのRailsプロジェクトに標準装備されているscaffoldジェネレータで生成します。

### scaffold生成
- Railsのscaffoldはrails generateスクリプトにscaffoldコマンドを渡すことで生成されます
- scaffoldコマンドの引数には、リソース名(この場合はUser)を使い、必要に応じてデータモデルの属性をオプションとして追加します。

```rails:ターミナル
$ rails generate scaffold User name:string email:string
```

- name:stringとemail:stringオプションを追加することで、Userモデルの内容が上記でのユーザーモデルと一緒の内容になります。
- idはRailsによって自動的に主キーとしてデータベースに追加されるため、追加は不要です。

### migrate(マイグレート)
- toyアプリ開発を進めるにはrails db:migrateを実行してデータベースをマイグレートする必要があります。
- 単にデータベースを更新し、usersデータモデルを作成するためのものです。

```rails:ターミナル
$ rails db:migrate
```

### ここでローカルサーバー起動
- rails serverを利用します。
 
```rails
$ rails server
```

- localhost:3000にアクセスしてhello, world!が表示で問題ない。
 
### ユーザー管理用ページ
- Usersリソースをscaffoldで生成したことで、ユーザー管理用のページが多数追加されてい
 
#### localhost:3000/users/newで新規登録ページ.

![](https://i.gyazo.com/c7a912deb4d8a0c3266cd6cac3bb7f0c.png)

- Create Userで登録、Backで戻る.

#### localhost:3000/usersで登録一覧.
 
![Image from Gyazo](https://i.gyazo.com/48ccbc3746c24a083d14461a6d88bd9d.png)

- Destroyを押下すると削除、Editで編集、Showでユーザー情報確認.

### MVC挙動
1. ブラウザから/usersというURLのリクエストをRailsサーバーに送信.
2. /usersリクエストは、Railsのルーティング(ルーター)によってUsersコントローラ内の適切なコントローラのアクションに割り当てられます
3. indexアクションが実行され、そこからUserモデルに、「すべてのユーザーを取り出せ」と問い合わせる。
4. Userモデルは問い合わせを受け、すべてのユーザーをデータベースから取り出す。
5. データベースから取り出したユーザーの一覧をUserモデルからコントローラに返す。
6. Usersコントローラは、ユーザーの一覧を@users変数(@はRubyのインスタンス変数を表す)に保存し、indexビューに渡す。
7. indexビューが起動し、ERB(Embedded RuBy: ビューのHTMLに埋め込まれているRubyコード)を実行してHTMLを生成(レンダリング) する。
8. コントローラは、ビューで生成されたHTMLを受け取り、ブラウザに返す。

### 継承
- scaffoldで生成したclass UsersController < ApplicationControllerという記法では、Rubyのクラス継承の文法をそのまま使っています。

### REST(REpresentational State Transfer)
- Webアプリケーション構造のパターン
- RESTは、インターネットそのものやWebアプリケーションなどネットワーク化されたシステムやアプリケーションを構築するためのアーキテクチャパターンのスタイルの1つです。

#### アーキテクチャとアーキテクチャパターンの違い
- アーキテクチャは、全体における役割を抽象化したものです。
- アーキテクチャパターンは役割に依存しないさまざまな役割に適応可能な制約の集合です。

### Usersリソースの欠点
- データの検証が行われていない。 このままでは、ユーザー名が空欄であったり、でたらめなメールアドレスを入力したりしても通ってしまいます。
- ユーザー認証が行われていない。 ログイン、ログアウトが行われていないので、誰でも無制限に操作できてしまいます。