1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【初心者プログラマー】SaveData開発日記 # ゲームを登録するところを作ろう

Posted at

前回のあらすじ

link(編集中)


今回はこの機能の根幹、ゲームを保存する場所を作っていくよ

※イメージこんな幹事
スクリーンショット 2026-01-17 14.31.25.png

スクリーンショット 2026-01-17 14.31.57.png

これを作るために必要なこと

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

そうすると
マイグレートファイル(下の緑のところ)ができるよ
スクリーンショット 2026-01-17 14.43.18.png

それを確認してマイグレーション

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

Image from Gyazo
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ルートを作って導いてあげる

しゃー.jpg
「ルーティング、私を導いてくれ」

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体裁を整えて、動作確認して、でげだ

そうしてできたのがこれです

スクリーンショット 2026-01-17 17.30.03.png

ちょっと改良

難しさと楽しさを5段階評価にしました。
スクリーンショット 2026-01-17 17.44.09.png

UIに関してはまだ固まってないので一旦これで
他の機能を実装していくよ

画像投稿機能についてはまたあとで実装します。
クラウディナリーというのがおすすめらしい。

まとまってないまとめというか感想

  • MVCの流れを意識しながら実装するとわかりやすいよ
  • gemは便利だが内容を理解した上で
    実行しないと遠回りになっちゃうかも
  • 画像投稿系は クラウディナリー、S3 Libvipなど
    いろいろあるらしい

次回は年表画面 メイン部分を作っていくよ。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?