はじめに
スマレジではLaravelをメインで使っているのですが副業で触っているRailsについては理解がまだまだ浅い部分があるため、個人開発でも触ってみたいと思います。
LaravelがRailsに影響を受けているフレームワークでもあるため、Railsを触ることでLaravelに活かせる知見も獲得できることを期待しています。
個人開発で作りたいもの
以前の参加した勉強会で、技術書を読む時にアウトプットしながら読むと理解が深まるという話を聞きました。
「勉強法の勉強会」参加レポと個人的な所感まとめ
ツイッターを例に挙げていたのですが、自分で見返すのが少ししんどそうだなと思ったので読書メモアプリを作ってみたいと思います。
イメージとしてはZennのScrapsをイメージしています。
ChatGPTを活用してみる
今回の個人開発でのテーマは以下です。
これ以外の情報についてはあえてそこまで構想を練らずに着手してみます。
なお、本記事はすべてChat GPT4を使用していますので、課金しようか迷っている方は参考にしてみてください。
第一の呪文 ドメインモデルを考える
あなたはプロのエンジニアです。zennというサービスのScrapsのような形でスレッド形式で読書メモを残すサービスを考えています。この場合にどのようなモデルが考えられますか。なお、ユーザーごとのログイン機能を実装する予定です。
回答
このタイプのサービスを設計するためには、以下のようなデータモデルを考えることができます。
ユーザーモデル (User model): ユーザーのログイン情報を管理するモデルです。名前、メールアドレス、パスワードのハッシュなどの情報を含むことが一般的です。
読書メモモデル (ReadingNote model): ユーザーが書く読書メモを管理するモデルです。メモの内容、作成日、最終更新日、関連する本のID、作成者(ユーザー)のIDなどを持つことが考えられます。
本モデル (Book model): メモが関連付けられる本を管理するモデルです。本のタイトル、著者、出版年、ISBNなどの情報を含むことが一般的です。
スレッドモデル (Thread model): 同じ本に関連するメモをまとめるためのスレッドを管理するモデルです。スレッドのタイトル、作成日、最終更新日、関連する本のID、スレッドの作成者(ユーザー)のIDなどを持つことが考えられます。
コメントモデル (Comment model): スレッド内の各読書メモに対するコメントを管理するモデルです。コメントの内容、作成日、最終更新日、関連する読書メモのID、コメントの作成者(ユーザー)のIDなどを持つことが考えられます。
以上のモデルは、各モデル間のリレーションシップ(関連)を考慮して作成する必要があります。例えば、読書メモモデルは作成者(ユーザーモデル)とのリレーションシップ、本モデルとのリレーションシップを持つべきです。同様に、コメントモデルは読書メモモデルとユーザーモデルとのリレーションシップを持つべきです。
これらのモデルはあくまで基本的なもので、具体的な要件やユースケースによりますので、必要に応じて拡張や修正が必要になるかもしれません。
はい、いうことなしです。というかそこまで深く考えてない状態で投げているので特に指摘する点も見つかりません。
ユーザーのログインについては以前の記事で紹介した通りOpenIDConnectのImplicit Flowを使って実装してみたいと思います。
参考: OIDCを使用したクライアントシークレットなしでのソーシャルログイン実装について調査してみる
ひとまず今回は本(Book)モデルから進めてみましょう。
第二の呪文 本モデル(Books)の作成
上記のうち、本モデルについてのCRUD処理をRails APIを用いて作成します。この場合の手順と具体的なコード例を教えてください
回答
Ruby on Railsを使用して本のモデルとそのCRUD操作を作成するには以下の手順を守ります。以下の例では、コマンドラインとエディタを使用します。
- 本のモデルの作成
まずはじめに本のモデルを作成します。ターミナルで次のコマンドを実行します。
rails g model Book title:string author:string publication_year:integer isbn:string
このコマンドで
Book
という名前のモデルが作成され、それに対応するマイグレーションファイルが生成されます。モデルには、title
,author
,publication_year
,isbn
という4つの属性を追加します。
- データベースのマイグレーション
生成したマイグレーションファイルをデータベースに適用します。ターミナルで次のコマンドを実行します。
rails db:migrate
- 本のコントローラーの作成
次に、本のCRUD操作を処理するコントローラーを作成します。ターミナルで次のコマンドを実行します。
rails g controller Books
- ルーティングの設定
config/routes.rb
ファイルを開き、以下のように設定します。Rails.application.routes.draw do resources :books end
これで
books
コントローラーに対するルーティングが自動で設定されます。
- コントローラーにCRUD操作を追加
app/controllers/books_controller.rb
ファイルを開き、CRUD操作を追加します。class BooksController < ApplicationController before_action :set_book, only: [:show, :update, :destroy] # GET /books def index @books = Book.all render json: @books end # GET /books/1 def show render json: @book end # POST /books def create @book = Book.new(book_params) if @book.save render json: @book, status: :created, location: @book else render json: @book.errors, status: :unprocessable_entity end end # PATCH/PUT /books/1 def update if @book.update(book_params) render json: @book else render json: @book.errors, status: :unprocessable_entity end end # DELETE /books/1 def destroy @book.destroy end private def set_book @book = Book.find(params[:id]) end def book_params params.require(:book).permit(:title, :author, :publication_year, :isbn) end end
これにより、BookモデルのCRUD操作が可能になります。すべての操作はJSON形式
でデータを返すように設定されています。各操作はHTTPリクエスト(GET, POST, PUT/PATCH, DELETE)と対応しています。
以上が基本的な手順となります。APIの設定はアプリケーションのニーズに応じて変更することができます。また、エラーハンドリングやセキュリティの観点(認証、認可)から見た場合、さらなる改善が必要となるでしょう。
具体的な方法についての回答が得られました。
ただ、経験上ChatGPTは嘘をつく、知ったかぶりをした回答をすることが多いため、きちんと裏を取る必要があります。
特に自分に知見がない分野の場合は注意が必要で、一見正しく見えるそれっぽい回答を吐くことが多々あります。
モデルの生成 ~ ルーティングの設定
先程生成された回答のうち、コマンドを提示されるものについては公式ドキュメントを見れば意図通りの出力かどうかを確認できます。
コントローラーにCRUD操作を追加
コントローラーの実装も公式ドキュメントを見ながら確認します。 また、基本的なコントローラに関する知識は公式ドキュメントにまとまっているので、こちらも参考にすると良いでしょう。
参考: https://railsguides.jp/action_controller_overview.html
不足している点
先程のChatGPTの回答で不足している点は、以下のようなものになります。
- エラーハンドリング
- 入力値のバリデーション
- 具体的なロジックの説明
単純に動くものとしては何度か質問を繰り返すと作成できるかと思いますが、実際にはエラーハンドリングやバリデーションといった部分をコントロールしようと思うと人間が考える必要があります。
また、Railsのフレームワークに関する知識の回答が少ないため、コードを出力させたうえで、知らない言語知識について公式ドキュメントで調べるという手順を踏む必要があります。
まとめ
今回はChatGPTを用いて、RailsのAPIを作成する方法を紹介しました。
個人開発等では、モデルの作成から実際のコーディングまで、幅広い分野での活用が期待できそうです。
ただ、ChatGPTは嘘をつくことが多いため、回答をそのまま鵜呑みにせず、公式ドキュメントを確認することが重要です。
個人的にはGitHub CopilotやChatGPTを使用することでAPIとペアプロをしている気分になって個人開発も楽しく進められるようになったなと思います。
最低限の問題解決能力がないとChatGPTを使用しても詰まってしまうことが多いのですが、問題解決の際にもかなり役に立つなと思いました。
これからも活用の方法を工夫しながら自身の成長を加速させるためにAI技術を使用してみたいと思います。