scaffoldとは
Railsではgenerateコマンドをコマンドライン上で用いることで、コントローラークラスなど様々なソースを自動で生成してくれます。
その中でもscaffoldは強力な機能で、モデルを生成しつつ、そのモデルに対するCRUD処理に関するソースも自動で生成します。
つまり、基本的なCRUD処理のみであれば、scaffoldコマンドを叩くだけで、作成が完了してしまうのです。
(体裁はCSSやJSで別途整えてあげる必要はありますが...)
以下にscaffoldの具体例を示します。
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 」にアクセスすることで利用することができます。
実際にアクセスして使ってみるとこんな感じです。
↑http://localhost:3000/tasks にアクセス。
↑一覧ページからNew Taskを押下し、内容を入力後「Create Task」を押下する。
↑登録が完了し、詳細ページに遷移。Backを押下すると一覧ページに遷移する。
↑先ほど登録した値が表示されている。また、詳細表示、編集、削除するためのリンクが生成されている。
scaffoldを使うべき人の考察
上述してきたようにscaffoldは便利な機能ですが、一方で黒魔術的要素も含んでいます。
つまり、何が生成されているのか、また、どういった仕組みで生成されたコードが動いているのかと行ったことが理解できていないと、技術的な伸び悩みやトラブルシューティングができないといった問題につながる危険性を孕んだ機能だと考えます。
ではどんな人がscaffoldを使うべきなのでしょうか。
Rails熟練者
上述した「何が生成されているのか、また、どういった仕組みで生成されたコードが動いているのか」といったことが理解できている方であれば、当然scaffoldは非常に便利な機能になります。
そのため、Railsに熟練した方であれば積極的に用いることで、効率的に開発を進めることができます。
逆に、これからエンジニアを目指す方や初心者の方はscaffoldを用いずに理解に努めた方が長い目で見たときにメリットが大きいように思います。
Rails以外の機能に触れてみたい/学びたい人
具体的に書くと、VueやCircleCIといったRailsと切り離された技術を学習してみたい人です。
これらを学ぶ際にscaffoldを用いてサクッとCRUD操作ができるページを作れば、自分の学習したい内容に集中できると思います。
超初心者
あえて、右も左もわからない超初心者がWebアプリ作成の雰囲気を知る最初のとっかかりとしてはscaffoldを用いるというのもアリだと思います。
ただし、そもそも超初心者がscaffoldを用いる段階まで開発環境を構築できるかといった問題は存在すると思います。
まとめ
scaffoldはモデルを生成しつつ、そのモデルに対するCRUD処理に関するソースも自動で生成してくれる機能ですが、黒魔術的な要素があるため、使い方には注意が必要です。
こちらのガイドでも訳注にて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