【第2章】rails tutorial 備忘録

# gemのインストールで早速エラー

```
USERnoMacBook-Air:tutorial2 user$ bundle install --without production
Could not locate Gemfile
```

gemがない？

なんのことはなく、コマンドを実行する階層を間違えていただけ。

tutorial/toy_app で実行。

##gitとherokuの準備

```
git init
git add -A
git commit -m "initialize repository"
git push origin mater

heroku create
```

controllerにhello アクションを追加

routes.rbに　root "application#hello"を設定

ここまでは１章と同じ

次にコミットして、herokuにプッシュ

```
git commit -am "Add hello"
heroku create
git push heroku master
```

## ユーザーモデル設計

|    users|users    |
|:-------|--------|
|id      |integer |
|name    |string  |
|email   |string  |

##マイクロポスト
|micropost|micropost   |
|:-------|--------|
|id      |integer |
|content   |text  |
|user_id   |integer  |


## 　scaffold
上記のユーザのデータモデルとそれを表示するwebアプリを実装

```
USERnoMacBook-Air:toy_app user$ rails g scaffold User name:string email:string
Running via Spring preloader in process 6200
      invoke  active_record
      create    db/migrate/20190408155708_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      create      app/views/users/_user.json.jbuilder
      invoke  test_unit
      create    test/system/users_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users.coffee
      invoke    scss
      create      app/assets/stylesheets/users.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss
```

二週目だとどんなファイルを作っているか理解ができて、面白い。

migrationファイルも作成されている。

## データモデルの作成

```
$ rails db:migrate
```
 これを忘れて、rails s をやると

![スクリーンショット 2019-04-09 1.09.55.png](https://qiita-image-store.s3.amazonaws.com/0/322607/158e4e47-fb4c-4a55-a922-72754566561a.png)

migrateしてよ、というエラーになる。


## scaffoldで作成されたもの
![スクリーンショット 2019-04-09 1.12.24.png](https://qiita-image-store.s3.amazonaws.com/0/322607/6d27e021-13d8-54e1-3a47-fe3419a749ea.png)

##CRUDが可能なページ群が作成される
久しぶりにrailsの教科書を読むと、懐かしくて、分かりやすい
Create　  作成するページ
Read      表示するページ（index, show)
update    更新するページ（edit)
Delete    削除するページ（delete)

## MVCの挙動
１　ブラウザから　”/users"などのリクエストを送る
２　routerがどのcontrollerのアクションを実行するか決める
３　アクションが実行され、モデルと更新する
４　modelは問い合わせ内容に応じて、DBから値を取り出す
５　modelはそれをcontrollerに返す
６　conntrollerはインスタンス変数に値を入れて、Viewに渡す
７　ViewがERBを実行したり、受け取った変数を使って、HTMLを作成（レンダリングする）
８　controllerはそれを受け取り、作成されたHTMLをブラウザに返す

## Usersコントローラの骨格
def index　一覧ページ表示
:
def show　ここのページを表示
:
def new 　新規作成ページを表示
:
def edit　編集ページを表示
:
def create　　新規作成処理のリクエスト（ページなし）
:
def upload　　編集・更新処理のリクエスト（ページなし）
:

つまずいたのは、ページを表示するものと処理だけをリクエストするものがあるということ

## RESTfulなスタイル
webアプリのシステムの様々な動きを　CRUDという４つの動きを基にして、構築していくこと、、、だと解釈しました。

ユーザー登録や投稿などの機能も分解して見ると、
CRUDという単位で構築することができる。

これをtutorial一週目の後半で、ハッと気付いてから、点と点が繋がり、理解が深まりました。

## マイクロポストも探索する

```
rails g scaffold Micropost content:text user_id:integer
rails db:migrate
```

config/routes.rbに
####resources :micropost
が作成される
usersの時もそうだが、
このresources :micropostによって、
以下のルートとアクションが知らぬ間に生成されているし、使える。

![スクリーンショット 2019-04-09 1.58.45.png](https://qiita-image-store.s3.amazonaws.com/0/322607/c6cbf6e9-c576-a43d-5d88-722721bcdcb5.png)

アクションはcontrollerにコードが記載されるから、分かるものの
routes.rbには、
resources :micropostしか記載がないから
上記のルートが使えるのがわからず、苦戦した。

##バリデーションを実装

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

##　データの紐付けをしてみる

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

## rails console
railsアプリケーションを対話的に操作して見る。
まずはUserとMicropostに登録した情報が入っているか確認

```
$rails c
>>User.all
#<ActiveRecord::Relation [#<User id: 1, name: "a1", email: "a1", created_at: "2019-04-08 16:13:19", updated_at: "2019-04-08 16:18:31">, #<User id: 2, name: "b", email: "", created_at: "2019-04-08 16:18:54", updated_at: "2019-04-08 16:21:47">, #<User id: 3, name: "aaaaaa", email: "aaaaa", created_at: "2019-04-09 02:43:32", updated_at: "2019-04-09 02:43:32">]>

>>MIcropost.all
 Micropost Load (1.0ms)  SELECT  "microposts".* FROM "microposts" LIMIT ?  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<Micropost id: 2, content: "aaaaaa", user_id: 1, created_at: "2019-04-09 02:47:53", updated_at: "2019-04-09 02:47:53">]>

```
値がちゃんと入っている

Userに紐づいたMicropostを、
Micropostに紐づいたUserを
取得する

```
idが1のユーザを取得
>>first_user = User.first

 そのユーザに紐づいたmicropostsを取得
>>first_user.microposts

取得した中で若いidのmicropostsを取得
>>micropost = first_user.microposts.first

そのmicropostsに紐づいているuserを取得
>> micropost.user
```

##　演習を解く

１ユーザーのshowページを編集し、ユーザーの最初のマイクロポストを表示してみましょう。

```ruby:users_controller.rb
 def show
    user = User.find(params[:id])
@content = user.microposts.first.content
end
```
@contentをviewsで表示するためusersのshow_html.erbも編集

```ruby:_show.html.erb
<p>
  <strong>Name:</strong>
  <%= @user.name %>
</p>

<p>
  <strong>Email:</strong>
  <%= @user.email %>
</p>
ここに挿入
<p>
<%= @content %>
<p>
```
①URLのusers/1の「１」をparams[:id]で取得。

②idが1のuserを取得。

③そのユーザの最初のmicropostのcontentをインスタンス変数に入れる。

④そのインスタンス変数をveiwsの_show.html.erbに渡し、表示させる


演習３
validateを追加して、
Userモデルのnameとemailが存在していることを検証してみてください。

```ruby:user.rb
class User < ApplicationRecord
    has_many :microposts
validates :name ,presence: true
validates :email,presence: true
end
```
![スクリーンショット 2019-04-09 13.24.33.png](https://qiita-image-store.s3.amazonaws.com/0/322607/7c1ea69f-dec7-acf5-b0f9-a181f55f62ec.png)

##継承

各モデルは
ActiveRecordを継承していて、
さらにActiveRecordはActiveRecord::Baseを継承している。

controllerも同じで
＜ApplicationController＜　ApplicationController::Baseと継承している。

上の階層のクラスに機能を実装すれば、
その下の階層の各クラスで機能が継承されるので、何度も同じコードを書く必要がない。

後々、ログインによる制御などで役立つ。

##デプロイ
```
$git add -A
$git commit -m "finish toy_app"
$git push origin master
$git push heroic

今回から、modelを使ったので、heroku上のデータベースを更新する

$heroku run rails db:migrate
```



##感想
今回はそこまで、エラーでつまずくことなく、進めた。
tutorial前半が分かっていないと後半で混乱するので、一つずつ丁寧に確認することを心がけた。