https://qiita.com/gabakugik/items/5dc1d9ba087d657873b6
前回の続きで詳細画面を作っていこうと思います。(next.js+rails+mysql)
backend/app/controllers/todos_controller.rb
class TodosController < ApplicationController
def index
# 日付が新しい順に10件まで取得する
@todos = Todo.all.order(created_at: :desc).limit(10)
render json: @todos
end
def show
@todo = Todo.find(params[:id])
render json: @todo
end
end
/frontend/app/todos/[id]/page.tsx
"use client";
import { useEffect, useState } from 'react';
import { useRouter } from 'next/navigation';
import useSWR from 'swr';
import Link from 'next/link';
import Todo from '@/components/Todo';
import { TodoType } from '@/types/Todo';
import axios from 'axios';
// Fetcher function for SWR
const fetcher = (url: string) => axios.get(url).then(res => res.data);
// Todo詳細ページを表示するコンポーネント
const TodoDetail = ({ params }: { params: { id: string } }) => {
// ルーティング情報を取得する
const router = useRouter();
const { id } = params;
// SWRを使ってデータを取得する
const { data: todo, error } = useSWR<TodoType>(id ? `http://localhost:3000/todos/${id}` : null, fetcher);
// エラーが発生した場合の処理
if (error) return <div>Failed to load</div>;
// Todoを取得中の場合は「Loading...」を表示する
if (!todo) return <div>Loading...</div>;
return (
<div className="flex justify-center items-center">
<div className="flex flex-col space-y-6 w-3/4 max-w-lg pt-10">
<label className="block text-xl font-bold text-gray-700">Todo</label>
<Todo todo={todo} />
<div className="flex justify-end">
<Link
href="/"
className="mt-auto font-medium text-blue-600 hover:bg-blue-300 focus:outline-none"
>
Back
</Link>
</div>
</div>
</div>
);
};
export default TodoDetail;
これでdocker-composeを行い、localhost:3001するとデータが表示されるのでそれをクリックして詳細画面が出るはずです。