RailsTutorial学習#2　第2章　Toyアプリケーション

#第2章 Toyアプリケーション

第2章Toyアプリケーション
2.1 アプリケーションの計画

```
$ cd ~/environment
$ rails _5.1.6_ new toy_app
$ cd toy_app/
```


```
$ bundle install --without production
もしうまく動かなかったらbundle updateを実行
```

最後に、GitでこのToyアプリケーションをバージョン管理下に置く

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

Bitbucketで新しいリポジトリを作成。
続いて、生成したファイルをこの新しいリモートリポジトリにプッシュ

```
$ git remote add origin git@bitbucket.org:<username>/toy_app.git
$ git push -u origin --all
```

Applicationコントローラにhelloアクションを追加
app/controllers/application_controller.rb

```
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

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

ルートルーティングを設定

config/routes.rb
```
Rails.application.routes.draw do
  root 'application#hello'
end
```
続いてこの変更をコミットし、Herokuにプッシュ

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

2.2 Usersリソース

```
$ rails generate scaffold User name:string email:string
```

データベースをマイグレートする
```
$ rails db:migrate
==  CreateUsers: migrating =================================
-- create_table(:users)
   -> 0.0017s
==  CreateUsers: migrated (0.0018s) ========================
```

```
$ rails server
```


2.2.1 ユーザーページを探検する
2.2.2 MVCの挙動

 Railsルートで使うUsersリソース用のルール
config/routes.rb

```
Rails.application.routes.draw do
  resources :users
  root 'application#hello'
end
```

```
ルートからusersへのルーティングを追加する
config/routes.rb
Rails.application.routes.draw do
  resources :users
  root 'users#index'
end
```

2.2.3 Usersリソースの欠点
・ データの検証なし。 このままだと、ユーザー名が空欄だったり、でたらめなメールアドレスを入力したりしても通る。
・ ユーザー認証なし。 ログイン、ログアウトが行われていない。誰でも無制限に操作できる。
・ テストが書かれていない。 厳密にはこれは正しい表現ではありません。というのも、scaffoldで生成したコードにはごく簡単なテストが一応含まれているからです。ただ、scaffoldのテストコードはデータ検証やユーザー認証、その他の必要な要求を満たしていません。
・ レイアウトやスタイルが整っていない。 サイトデザインも操作法も一貫していません。
・ 理解が困難。 scaffoldのコードを理解できるぐらいなら、そもそも本書を読む必要はないでしょう。



2.3 Micropostsリソース

```
rails generate scaffold Micropost content:text user_id:integer
```

2.3.1 マイクロポストを探検する

```
rails db:migrate
```

```
Railsルートで使うMicropostsリソース用のルール
config/routes.rb
Rails.application.routes.draw do
  resources :microposts
  resources :users
  root 'users#index'
end
```

2.3.2 マイクロポストをマイクロにする

マイクロポストの最大文字数を140文字に制限する。
app/models/micropost.rb

```
class Micropost < ApplicationRecord
  validates :content, length: { maximum: 140 }
end
```

2.3.3 ユーザーはたくさんマイクロポストを持っている

1人のユーザーに複数のマイクロポストがある。
app/models/user.rb

```
class User < ApplicationRecord
  has_many :microposts
end
```

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

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

```
$ rails console
>> first_user = User.first
=> #<User id: 1, name: "Michael Hartl", email: "michael@example.org",
created_at: "2016-05-15 02:01:31", updated_at: "2016-05-15 02:01:31">
>> first_user.microposts
=> [#<Micropost id: 1, content: "First micropost!", user_id: 1,
created_at: "2011-11-03 02:37:37", updated_at: "2011-11-03 02:37:37">,
"2016-05-15 02:37:37", updated_at: "2016-05-15 02:37:37">,
#<Micropost id: 2, content: "Second micropost", user_id: 1,
created_at: "2016-05-15 02:38:54", updated_at: "2016-05-15 02:38:54">]
>> micropost = first_user.microposts.first
=> #<Micropost id: 1, content: "First micropost!", user_id: 1, created_at:
"2016-05-15 02:37:37", updated_at: "2016-05-15 02:37:37">
>> micropost.user
=> #<User id: 1, name: "Michael Hartl", email: "michael@example.org",
created_at: "2016-05-15 02:01:31", updated_at: "2016-05-15 02:01:31">
>> exit
```

```
マイクロポストのコンテンツが存在しているかどうかの確認
app/models/micropost.rb
class Micropost < ApplicationRecord
  belongs_to :user
  validates :content, length: { maximum: 140 },
                      presence: true
end
```

```
Userモデルに存在性のバリデーションを追加する
app/models/user.rb
class User < ApplicationRecord
  has_many :microposts
  validates FILL_IN, presence: true    # 「FILL_IN」をコードに置き換えてください
  validates FILL_IN, presence: true    # 「FILL_IN」をコードに置き換えてください
end
```


2.3.4 継承の階層
2.3.5 アプリケーションをデプロイする


```
$ git status
$ git add -A
$ git commit -m "Finish toy app"
$ git push
```

```
$ git push heroku
```

(上のコマンド操作では、2.1のHerokuアプリを作成済みであることが前提です。アプリを作成していないのであれば、先にheroku create、git push heroku masterを実行してから上のコマンド操作を実行してください。)

アプリケーションのデータベースを動作させるためには、次のheroku runコマンドを実行して本番データベースのマイグレーションを行う必要もあります (リスト 2.4)。

```
$ heroku run rails db:migrate
```