Rails チュートリアル　２章

#デモアプリの作成


####アプリケーションの骨組みを作る

```
$ cd ~/environment
$ rails _6.0.3_ new toy_app
$ cd toy_app/
```

###gemの書き換え

内容は前回と一緒
そしてインストール

```
$ bundle install --without production
```

###gitの管理下に置く

```
$ git init
$ git add -A
$ git commit -m "Initialize repository"
```

###git hubに新しいリポジトリを追加する
前回と同じ手順で作成
そしてリモートリポジトリにプッシュを忘れずに

```
$ git remote add origin https://github.com/<あなたのGitHubアカウント名>/toy_app.git
$ git push -u origin master
```

###前回のHello world同様にデプロイの準備をする
まずコントローラーの設定から

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base

  def hello
    render html: "hello, world!"
  end
end
```

そしてルーティングの設定

```ruby:config/routes.rb
Rails.application.routes.draw do
  root 'application#hello'
end
```

そして変更をコミットしてherokuへプッシュ

```
$ git commit -am "Add hello"
$ heroku create
$ git push && git push heroku master
#↑gitのリポジトリとherokuを同期している
```

##usersモデル
|users|   |
|:---|:---|
|id|integer|
|name|string|
|email|string|


##micro postモデルの設計

|micropost|   |
|:---|:---|
|id|integer|
|content|text|
|user_id|integer|

↑のデータモデルを実装
↓

```
$ rails generate scaffold User name:string email:string
#name:string email:stringを追加することでモデル内容が上記のusersモデルのようになる
```

>ここのUsersリソースはすべてのRailsプロジェクトに標準装備されているscaffoldジェネレータで生成します.

そして

```
$ rails db:migrate
```
でデータベースを更新してusersモデルを作成する

そして前章同じく

```ruby:config/environments/development.rb
 # Cloud9 への接続を許可する
  config.hosts.clear
```
そしてrails server起動

しかし問題発生

![スクリーンショット 2021-02-18 063320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916905/f35b171b-e96a-947c-bca6-3cfe775caa32.png)

hello worldが表示されない。

>解決策
・更新したファイルに上書き保存を実行
・refresh file treeを実行

しかしうまくいかず。

そこで重大な落とし穴に気が付いた。

```
$ cd ~/environment/toy_app/
```
指定するの忘れてたTT

原因がわかったということで無事起動。
問題解決。


##ユーザーページを動かしてみる
urlに/usersと入力


##2.2.1演習
>1、消える
2、作成されてしまう
3、間違っているのにも関わらず更新されてしまう
4、User was successfully destroyed.と表示する


##MVCの挙動
>rails　チュートリアルから引用（https://railstutorial.jp/chapters/toy_app?version=6.0#cha-a_toy_app）

>1.ブラウザから「/users」というURLのリクエストをRailsサーバーに送信する。

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

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

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

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

>6.sersコントローラは、ユーザーの一覧を@users変数（@はRubyのインスタンス変数を表す）に保存し、indexビューに渡す。

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

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

## ユーザーからリクエストされたURLを、Usersリソースで使うコントローラのアクションに割り当てるためのコード

```ruby:config/routes.rb
Rails.application.routes.draw do
  resources :users
  root 'application#hello'
end
```


##/にアクセスしたら/usersにアクセスするようにする

```ruby:/toy_app/config/routes.rb
Rails.application.routes.draw do
  resources :users
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
  root 'application#hello'
end
```

を

```ruby:/toy_app/config/routes.rb
Rails.application.routes.draw do
  resources :users
  root 'users#index'
end
```
に変更する


##indexアクション

```ruby:app/controllers/users_controller.rb
class UsersController < ApplicationController
  .
  .
  .
  def index
    @users = User.all
  end
  .
  .
  .
end
```

userモデルのすべてのユーザーを@users変数に保存


##@users変数
@記号で始まる変数をインスタンス変数とよぶ。
railsコントローラ内で宣言したインスタンス変数はビューでも使えるようになる

##2.2.2演習
1、![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916905/85788fff-2421-8410-e3c4-a04635964538.png)

2、userコントローラーのprivateの場所にある

3、edit.html.erb


##このscaffoldで自動生成されたコードの問題点
1、適当なメールアドレスを打っても通ってしまう
2、ログインログアウトがない
3、テストがない
4、ダサい

##micropostリソースを追加
```
$ rails generate scaffold Micropost content:text user_id:integer
```


routesにルーティングルールを追加（自分で追加する）
```ruby:config/routes.rb
Rails.application.routes.draw do
  resources :microposts
  resources :users
  root 'users#index'
end
```

ルーティングルールを追加したことにより
![スクリーンショット 2021-02-23 014623.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916905/3aa14bfa-1750-ef97-4570-3e91817253a4.png)

が使えるようになった


##演習
1、消える
2、作成されてしまう
3、作成されてしまう


##マイクロポストの文字数を制限する
```ruby:app/models/micropost.rb
class Micropost < ApplicationRecord
  validates :content, length: { maximum: 140 }
end
```

##2.3.2演習

1、エラーが出るようになった
2、noticeが使われてない

##異なるデータモデルの関連付け

1人のユーザーに複数のマイクロポストがある。

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

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

```ruby:app/models/micropost.rb
class Micropost < ApplicationRecord
  belongs_to :user
  validates :content, length: { maximum: 140 }
end
```
>引用
https://railstutorial.jp/chapters/toy_app?version=6.0#cha-a_toy_app
2．3.3

##2.3.3演習
1.

```
<p>
  <strong>Micropost:</strong>
  <%= @user.microposts.first.content %>
</p>
```

##モデル、コントローラー継承

userモデル、micropostモデルはそれぞれapplicationモデルを継承していてapplicationモデルはActiveRecord::Baseを継承している
userモデル、micropostモデルはそれぞれapplicationコントローラーを継承していて、applicationコントローラーはActionController::Baseを継承している