Railsチュートリアル 第２章

この章では、scaffold機能を使ってコードを自動生成する方法などを学んだ。

#scaffoldとは
本来、Railsでアプリケーションを作成するには、モデル、コントローラー、ビュー等を作り、ルーティングも作成する必要があるが、それをコマンド一つで一括で作成してくれるのがscaffold。

#試しにscaffoldを試してみると
今回は、ユーザー情報（名前、メールアドレス）の登録・更新・削除が行える画面を作ってみる。

```
$ rails generate scaffold User name:string email:string
  invoke  active_record
  create    db/migrate/20200122063729_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
```

config/routes.rb に「resources :users」が追加された事で、Railsで定義されている７つのアクションがセットで追加されていることがわかります。

```
$ rails routes
   Prefix Verb   URI Pattern               Controller#Action
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy
     root GET    /                         
```

正確に言うと、updateが２つ存在し、８つのアクションが作成されているが、PUTリクエストの方は昔の名残？か何かで実際にはPATCHが使われる。

また、７つのアクションが作成されると言ったが、usersコントローラーを見ると、７つ以上のアクションが自動で作成されているが、このcreate,update,destroyはページを出力せずベータベース上のユーザー情報の操作するだけのため。

###一括で作成できたが、問題もたくさん
scaffoldコマンド一つで、ユーザーの新規登録、更新、削除が行える画面が作成できたが、この時点では下記のような問題が残っている。

- データの検証が行われていないので、空情報を登録できてしまう
- ユーザー認証が行われていないので、誰でも自由に登録や削除ができてしまう
- テストが書かれていない
- レイアウトが整っていない

##scaffoldの取り消し
間違った名前などで作成してしまったなどした時の取り消し手順

```
$ rails destroy scaffold users
```

但し、これだけではデータベースにまだテーブルが残ってしまうので、マイグレーションファイルを作成する。

```
rails g migration users
```

作成したマイグレーションフィアるにusersテーブルの削除命令を書く。

```
class Users < ActiveRecord::Migration[5.1]
  def change
    drop_table :users
  end
end
```

あとはマイグレートして無事完了

```
$ rails db:migrate
```


##@記号で始まる変数
@で始まる変数をインスタンス変数と呼び、コントローラー内で宣言されたインスタンス変数はビューでも使えるようになる。
つまり、逆に@が付いていない変数はビューでは使えない。

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

##この章で失敗したこと
試しにscaffoldしたファイル群を削除するのをしたときにusersテーブルの削除するマイグレーションファイルが残ったまま、herokuにpushしてしまい、migrateしてもエラーが出ているのを5分ぐらい気づけなかった。。