前回のあらすじ
link(編集中)
今回はこの機能の根幹、ゲームを保存する場所を作っていくよ
これを作るために必要なこと
1:まずゲームを登録するための枠
modelを作って編集する
2:これを動かすためにコントローラーを作る
3:見た目(UI)のところ、viewを作る
4:ルーティングで道を作ってあげる
5:体裁整える
6:動作確認、完成
MODELをつくるぞ
作る時はもうめんどくさいので←👀👀👀
docker compose exec web rails g model Game \
title:string \
hardware:string \
type:string \
reccomended:string \
difficulty:string \
started_year:integer \
ended_year:integer \
memo:text \
user:references
そうすると
マイグレートファイル(下の緑のところ)ができるよ

それを確認してマイグレーション
docker compose exec web rails db:migrate
コントローラーとビューは突然に
ここで超便利必殺技コマンドを打ちます
コントローラーを作っていたらビューも作っていたってやつです。
docker compose exec web rails g controller Games new create
create app/controllers/games_controller.rb
route get "games/new"
get "games/create"
invoke tailwindcss
create app/views/games
create app/views/games/new.html.erb
create app/views/games/create.html.erb
invoke test_unit
create test/controllers/games_controller_test.rb
invoke helper
create app/helpers/games_helper.rb
invoke test_unit

gamesのコントローラーを作ったら一緒に
games のビューも作成されました。便利すぎるね
今回はnew と createを作りました。
今後増やす時はまた付け足していきます。
コントローラーの中身をいじる
class GamesController < ApplicationController
before_action :authenticate_user!
def new
@game = Game.new
end
def create
@game = current_user.games.build(game_params)
if @game.save
redirect_to root_path, notice: "冒険を記録しました"
else
render :new, status: :unprocessable_entity
end
end
private
def game_params
params.require(:game).permit(
:title,
:hardware,
:type,
:reccomended,
:difficulty,
:ended_year,
:memo
)
end
end
end
余談 なんでscaffoldを使わないの??
A.要らないものも一緒に作られちゃうから
index / show / edit / destroy → ほぼ消す
routes を only: に絞る
やれないことはないのだがこのコマンドを実行した後に
こういった手間ができてしまうので個別に今回は作りました。
4・5ルートを作って導いてあげる
configの中のroutes.rbに追記をしていきます。
# app/config/routes.rb
resources :games, only: %i[new create]
# gameを登録するためのルーティング設定!
# newアクションとcreateアクションのみを使用するため、
onlyオプションで制限
# newアクションはゲーム登録フォームの表示に使用、
createアクションはフォーム送信後のデータ保存に使用される。
関係性の記述
🎮ゲームは
いっぱい登録できる。
対して
ユーザーは一人🙋♂️
このユーザーのテーブルに対して
複数のゲーム(多)だから
以下の記述になります。
# app/models/user.rb
has_many :games, dependent: :destroy
# 1人のユーザーは複数のゲームを持つことができる(1対多の関係)ことを示しています。
# dependent: :destroy オプションは、ユーザーが削除された場合に、
そのユーザーに関連する全てのゲームも一緒に削除されることを意味します。
反対にgame側も設定します。
各ゲーム側からみた時に(重要!!!!)
それは1人のユーザーに対して属している、関連づいている
(多対1の関係)
ことを示しています。
# app/models/game.rb
belongs_to :user
# belongs_to :user は、Gameモデルが
Userモデルに属していることを示し、
# 各ゲームが特定のユーザーに関連付けられていることを意味します。
5・6体裁を整えて、動作確認して、でげだ
そうしてできたのがこれです
ちょっと改良
UIに関してはまだ固まってないので一旦これで
他の機能を実装していくよ
画像投稿機能についてはまたあとで実装します。
クラウディナリーというのがおすすめらしい。
まとまってないまとめというか感想
- MVCの流れを意識しながら実装するとわかりやすいよ
- gemは便利だが内容を理解した上で
実行しないと遠回りになっちゃうかも - 画像投稿系は クラウディナリー、S3 Libvipなど
いろいろあるらしい
次回は年表画面 メイン部分を作っていくよ。




