はじめに
はじめまして。今回初めて記事を書きます。にゃこすと申します。よろしくお願いいたします。
今回のテーマは「Scaffoldを複数使ってみた」です。
Scaffoldはプログラミング学習を始めてかなり序盤に学習したので、現役エンジニアの方が思いつかない発想かもしれないなと思い、記事を書いてみます。
※初学者による記事のため正確性に欠ける場合があります。記事についてお気づきの点がございましたらご指摘いただけますと幸いです。
scaffoldって?
"アプリケーションの基本的な機能の一覧(index)、詳細(show)、新規作成(new/create)、編集(edit/update)、削除(destroy)するために必要なコントローラ、モデル、ビューをまとめて生成"できる便利なコマンドです。
--引用元 Railsドキュメント
なんでScaffoldを複数使おうと思ったの?
Webアプリを作成している際に、タスク管理アプリも掲示板アプリも欲しい!!となったことがきっかけです。
どちらか片方を作ったり、掲示板アプリを作ってからコメント機能をつけたり等の機能拡張をやってみたことはありましたが、
両方Scaffoldってやってみたことないな、、、やったらどうなるの?と思い試してみました。
さっそく実践
タスク管理⇨掲示板の順番で作ってみようと思います。
rails new test_scaffolds
まずはアプリを作成しました。まだmodel, view, controllerは作成されていない状態です。
ここで1回目のscaffoldを実行してみます。
bin/rails g scaffold Task title:string body:string deadline:datetime
カラムはアプリに適したものを設定していただければ良いですが、今回は
「タスクも掲示板もtitleとbodyにならないか、、、?」
と気づいたので急遽締切を入力するdeadlineカラムも作ってみました。
invoke active_record
create db/migrate/20231011132841_create_tasks.rb
create app/models/task.rb
invoke test_unit
create test/models/task_test.rb
create test/fixtures/tasks.yml
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 test_unit
create test/controllers/tasks_controller_test.rb
create test/system/tasks_test.rb
invoke helper
create app/helpers/tasks_helper.rb
invoke test_unit
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
自動でこんなに沢山のファイルを作ってくれます。便利ですね〜
いらないものは最初からオプションでスキップできます。
一度できたアプリを見てみます。
bin/rails db:migrate
bin/rails s
http://localhost:3000/tasks
にアクセスします。
UTCなのね、、、!
UTCをJSTに変更する方法は他の記事に譲ります、、、
続いて、2回目のscaffoldを実行してみます!
作業ディレクトリはそのままで大丈夫です。
bin/rails g scaffold Board title:string body:string
invoke active_record
create db/migrate/20231011134516_create_boards.rb
create app/models/board.rb
invoke test_unit
create test/models/board_test.rb
create test/fixtures/boards.yml
invoke resource_route
route resources :boards
invoke scaffold_controller
create app/controllers/boards_controller.rb
invoke erb
create app/views/boards
create app/views/boards/index.html.erb
create app/views/boards/edit.html.erb
create app/views/boards/show.html.erb
create app/views/boards/new.html.erb
create app/views/boards/_form.html.erb
invoke test_unit
create test/controllers/boards_controller_test.rb
create test/system/boards_test.rb
invoke helper
create app/helpers/boards_helper.rb
invoke test_unit
invoke jbuilder
create app/views/boards/index.json.jbuilder
create app/views/boards/show.json.jbuilder
create app/views/boards/_board.json.jbuilder
invoke assets
invoke coffee
create app/assets/javascripts/boards.coffee
invoke scss
create app/assets/stylesheets/boards.scss
invoke scss
identical app/assets/stylesheets/scaffolds.scss
ここでもう一度できたアプリを見てみましょう。
bin/rails db:migrate
bin/rails s
こちらも問題なさそうですね。
というわけで、1つのアプリの中でScaffoldは複数使えることがわかりました!
仕上げ
せっかく2つの機能を1つのアプリに閉じ込めたので、相互にアクセスできるようにしないと意味ないですよね。
また、rootパスもYay! You’re on Rails!
のままなので変更していきます。
Rails.application.routes.draw do
root to: 'tasks#index' # この行を追記
resources :boards
resources :tasks
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
サーバーを起動して確認します。
bin/rails s
rootパスに設定できました。
次にTasksからBoradsへ、BoardsからTasksへのリンクをそれぞれ作成します。
<p id="notice"><%= notice %></p>
<h1>Tasks</h1>
<table>
<thead>
<tr>
<th>Title</th>
<th>Body</th>
<th>Deadline</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @tasks.each do |task| %>
<tr>
<td><%= task.title %></td>
<td><%= task.body %></td>
<td><%= task.deadline %></td>
<td><%= link_to 'Show', task %></td>
<td><%= link_to 'Edit', edit_task_path(task) %></td>
<td><%= link_to 'Destroy', task, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New Task', new_task_path %> |
<%= link_to 'Go to Boards', boards_path %> # |以降を追記
(Taskとほぼ同じなので省略)
<%= link_to 'New Board', new_board_path %>|
<%= link_to 'Go to Tasks', tasks_path %> # |以降を追記
サーバーを起動して確認します。
bin/rails s
お互いにリンクを作成することができました!!
おわりに
何もない0から1を生み出すのは大変ですが、scaffoldから少しずつ機能を足していったり、逆に不要なものを後から削ってみたり、あるものから試行錯誤するのはいくらかやりやすいのではないでしょうか!
scaffoldって複数でも使えるんだ!面白い!と思っていただけたら幸いです。