バカとscaffoldは使いよう〜Railsにおけるscaffoldの使い方と使うべき人の考察〜

## scaffoldとは

Railsではgenerateコマンドをコマンドライン上で用いることで、コントローラークラスなど様々なソースを自動で生成してくれます。

その中でもscaffoldは強力な機能で、モデルを生成しつつ、そのモデルに対するCRUD処理に関するソースも自動で生成します。

つまり、基本的なCRUD処理のみであれば、scaffoldコマンドを叩くだけで、作成が完了してしまうのです。
(体裁はCSSやJSで別途整えてあげる必要はありますが...)

以下にscaffoldの具体例を示します。

```console
root@5590aed3ec01:/myapp# rails generate scaffold Task title:string priority:integer
Running via Spring preloader in process 167
      invoke  active_record
      create    db/migrate/20190828225200_create_tasks.rb
      create    app/models/task.rb
      invoke    rspec
      create      spec/models/task_spec.rb
      invoke  resource_route
       route    resources :tasks
      invoke  scaffold_controller
      create    app/controllers/tasks_controller.rb
      invoke    erb
      create      app/views/tasks
      create      app/views/tasks/index.html.erb
      create      app/views/tasks/edit.html.erb
      create      app/views/tasks/show.html.erb
      create      app/views/tasks/new.html.erb
      create      app/views/tasks/_form.html.erb
      invoke    rspec
      create      spec/controllers/tasks_controller_spec.rb
      create      spec/views/tasks/edit.html.erb_spec.rb
      create      spec/views/tasks/index.html.erb_spec.rb
      create      spec/views/tasks/new.html.erb_spec.rb
      create      spec/views/tasks/show.html.erb_spec.rb
      create      spec/routing/tasks_routing_spec.rb
      invoke      rspec
      create        spec/requests/tasks_spec.rb
      invoke    helper
      create      app/helpers/tasks_helper.rb
      invoke      rspec
      create        spec/helpers/tasks_helper_spec.rb
      invoke    jbuilder
      create      app/views/tasks/index.json.jbuilder
      create      app/views/tasks/show.json.jbuilder
      create      app/views/tasks/_task.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/tasks.coffee
      invoke    scss
      create      app/assets/stylesheets/tasks.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss
```

ご覧のとおり、コントローラーやerb、マイグレーションファイル、さらにはテストファイルまでまとめて生成されています。

今回の例では `rails generate scaffold Task title:string priority:integer` としました。
イメージはToDoアプリで、このコマンドにより、文字列で扱う「タイトル」と数字で扱う「優先度」を持つタスクモデルとそれに対するCRUD処理をするためのソースが作成されます。

あとは`rails db:migrate` でマイグレーションを実行すれば、完了です。

実際に作成されたページは「ルートURI/モデル名」に割り振られていて、今回の自分の例ですと、「http://localhost:3000/tasks 」にアクセスすることで利用することができます。

実際にアクセスして使ってみるとこんな感じです。

<img width="1439" alt="スクリーンショット 2019-09-14 11.38.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239294/a4fa78d9-c012-5a8e-ead3-d1527900fec3.png">
↑http://localhost:3000/tasks にアクセス。

<img width="1439" alt="スクリーンショット 2019-09-14 11.42.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239294/36e6d782-3619-e065-6f3e-0bcde9ee83a9.png">
↑一覧ページからNew Taskを押下し、内容を入力後「Create Task」を押下する。

<img width="1439" alt="スクリーンショット 2019-09-14 11.43.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239294/a3bceaa2-0f94-629b-2094-8ef7f4e340ee.png">
↑登録が完了し、詳細ページに遷移。Backを押下すると一覧ページに遷移する。


<img width="1439" alt="スクリーンショット 2019-09-14 11.43.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239294/8e3d6459-25a7-3188-5f3e-a7594ecdade2.png">
↑先ほど登録した値が表示されている。また、詳細表示、編集、削除するためのリンクが生成されている。

## scaffoldを使うべき人の考察

上述してきたようにscaffoldは便利な機能ですが、一方で黒魔術的要素も含んでいます。
つまり、何が生成されているのか、また、どういった仕組みで生成されたコードが動いているのかと行ったことが理解できていないと、技術的な伸び悩みやトラブルシューティングができないといった問題につながる危険性を孕んだ機能だと考えます。

ではどんな人がscaffoldを使うべきなのでしょうか。

### Rails熟練者
上述した「何が生成されているのか、また、どういった仕組みで生成されたコードが動いているのか」といったことが理解できている方であれば、当然scaffoldは非常に便利な機能になります。

そのため、Railsに熟練した方であれば積極的に用いることで、効率的に開発を進めることができます。
逆に、これからエンジニアを目指す方や初心者の方はscaffoldを用いずに理解に努めた方が長い目で見たときにメリットが大きいように思います。

### Rails以外の機能に触れてみたい/学びたい人
具体的に書くと、VueやCircleCIといったRailsと切り離された技術を学習してみたい人です。

これらを学ぶ際にscaffoldを用いてサクッとCRUD操作ができるページを作れば、自分の学習したい内容に集中できると思います。

### 超初心者
あえて、右も左もわからない超初心者がWebアプリ作成の雰囲気を知る最初のとっかかりとしてはscaffoldを用いるというのもアリだと思います。

ただし、そもそも超初心者がscaffoldを用いる段階まで開発環境を構築できるかといった問題は存在すると思います。

## まとめ
scaffoldはモデルを生成しつつ、そのモデルに対するCRUD処理に関するソースも自動で生成してくれる機能ですが、黒魔術的な要素があるため、使い方には注意が必要です。

[こちら](http://ruby.studio-kingdom.com/rails/guides/getting_started)のガイドでも訳注にてscaffoldの項目が取り除かれた理由として初心者の理解の妨げになるからではないかと指摘しているぐらいです。

こうした背景から、今のところ私はscaffoldはRailsを使い慣れている方やRails以外の技術を学ぶ際の補助として使うのが、効率的だと考えています。

「バカとハサミは使いよう」と言いますが、scaffoldも適切なタイミングで上手に活用していきたいですね。皆様の意見もお待ちしています。

最後までお読みいただきありがとうございました。

## 参考文献

Railsのgenerateコマンドの解説
https://railsguides.jp/command_line.html#rails-generate

scaffoldの詳細
http://ruby.studio-kingdom.com/rails/guides/getting_started_v3#4