Ruby on Rails チュートリアルって長いのでサマリー(2章)〜scaffoldとrake〜


Ruby on Rails チュートリアル
http://railstutorial.jp/

# 前提
* Mac OS X Yosemite
* Homebrewは入ってる
* gemは入ってる
* gitとかHerokuとかruby以外でも使うものは知ってる

# scaffoldとrake

## アプリ作成

```
cd rails_projects
rails new demo_app
cd demo_app
```

## Gemfile更新とbundle

Gemfileを適宜更新。
sqlite3はherokuで使えなく、postgresをherokuで使うので以下のように変更するなど。

参考：http://railsgirls.jp/heroku/

```
# 追加（HerokuデプロイでWARNINGがでるから）
ruby '2.2.0'

# gem 'sqlite3'
group :development do
  gem 'sqlite3'
end

# 追加
group :production do
  gem 'pg'
  gem 'rails_12factor'
end
```

--without productionオプションを追加すると、本番用のgemはローカルの環境にはインストールされない

```
bundle install --without production
bundle update
bundle install
```

## commit

```.gitignore
# Ignore bundler config.
/.bundle

# Ignore the default SQLite database.
/db/*.sqlite3
/db/*.sqlite3-journal

# Ignore all logfiles and tempfiles.
/log/*.log
/tmp

# Ignore other unneeded files.
doc/
*.swp
*~
.project
.DS_Store
.idea
.secret
```

```
git init
git add .
git commit -m "Initial commit"
```

## scaffoldとrake(Userモデル)

Userモデルは次の構造

項目|型
---|---
id|integer
name|string
email|string

### scaffold

idは自動生成されるので指定不要

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

### rake

データベースにマイグレートする。

```
bundle exec rake db:migrate
```

## rails server起動

`rails s`は`rails server`の短縮形

```
rails s
```

以下のURLでアクセス。
もうできてる！

```
http://localhost:3000/users
```

## できたものの確認

### config/routes.rb

ルーティングの設定。

### app/models/user.rb

Userモデル。
Active Recordを継承している（'<'で継承）ので、Controllerの中で、User.allですべてのユーザーを取得できるらしい。

```
class User < ActiveRecord::Base
end
```

### app/controllers/users_controller.rb

Controller。
httpメソッドのPOST、PATCH、DELETEもできてる。
いらないなら消すなど必要に応じて編集する。
indexで`@users`に全てのユーザーをいれてる。

```
def index
    @users = User.all
end
```

### app/views/users/index.html.erb

Controllerで`@users`に全てのユーザーをいれてるのでそれをループで表示している。

```
<% @users.each do |user| %>
  <tr>
    <td><%= user.name %></td>
    <td><%= user.email %></td>
    <td><%= link_to 'Show', user %></td>
    <td><%= link_to 'Edit', edit_user_path(user) %></td>
    <td><%= link_to 'Destroy', user, method: :delete,
                                     data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>
```

## scaffoldとrake(Micropostモデル)

Micropostモデルは次の構造。
外部キー`user_id`は命名規約に注意。

項目|型
---|---
id|integer
content|string
user_id|integer

以下、Userモデルと同じように実行

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

```
bundle exec rake db:migrate
```

```
rails s
```

```
http://localhost:3000/microposts
```

## Validationの追加

contentの最大文字数を140にする。

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

## アソシエーションの設定

Userは複数のMicropostを持ち、MicropostはUserに属する。

```app/models/user.rb
class User < ActiveRecord::Base
  has_many :microposts
end
```

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

rails consoleコマンドで確認

```
rails console

>> first_user = User.first

>> first_user.microposts

>> exit
```

# デプロイ

## コミット

```
git add .
git commit -m "Finish demo app"
```

## デプロイ

```
heroku create
git push heroku master
```

## データベースのマイグレート

```
heroku run rake db:migrate
```

## 確認

```
heroku open
```

```
https://XXX.herokuapp.com/users
https://XXX.herokuapp.com/microposts
```