前提
SPA構成でポートフォリオ作成をしています。
RailsはAPIモードで作成しています。もともと以下のようにコントローラから直接JSONデータを返すようにしていました。この時点では想定しているJSONデータが返っています。
app/controllers/api/v1/users_controller.rb
ruby
1class API::V1::UsersController < ApplicationController 2 before_action :set_user, only: %i[show] 3 4 def show 5 render json: { 6 id: @user.id, 7 name: @user.name, 8 introduction: @user.introduction, 9 createdAt: @user.created_at, 10 updatedAt: @user.updated_at 11 }, status: :ok 12 end 13 14 private 15 16 def set_user 17 @user = User.find(params[:id]) 18 end 19end
ここで、JSONシリアライザであるgem jbを導入して以下のように変更したのですが、エラーが発生しております。(エラー内容は後に記載)
jb: https://github.com/amatsuda/jb
app/controllers/application_controller.rb
ruby
1class ApplicationController < ActionController::API 2 include ActionView::Rendering 3end
app/controllers/api/v1/users_controller.rb
ruby
1class API::V1::UsersController < ApplicationController 2 before_action :set_user, only: %i[show] 3 4 def show 5 end 6 7 private 8 9 def set_user 10 @user = User.find(params[:id]) 11 end 12end
app/views/users/show.json.jb
ruby
1json = { 2 id: @user.id, 3 name: @user.name, 4 introduction: @user.introduction, 5 created_at: @user.created_at, 6 updated_at: @user.updated_at 7} 8 9json
show.json.jbを置く階層が間違っているのではないかと思い、app/views/api/v1/users/show.json.jbに変更してみましたが、同じくエラーが発生しました。
実現したいこと
showアクション実行時にJSONデータを返したい。
エラーメッセージ
Completed 406 Not Acceptable in 6ms (ActiveRecord: 0.5ms | Allocations: 624) ActionController::UnknownFormat (API::V1::UsersController#show is missing a template for this request format and variant. request.formats: ["text/html"] request.variant: []):
試したこと
「gem jb 使い方」いくつか検索して1~2ページ目に表示される関連するページに書かれている内容は大体試してみましたが、エラーが発生します。具体的には以下のようなことを試しました。
-
公式ページを確認 https://github.com/amatsuda/jb
-
routes.rbにdefault: { format: 'json' }を追加
ruby
1Rails.application.routes.draw do 2 namespace :api, default: { format: 'json' } do 3 namespace :v1 do 4 resources :users, only: %i[show] 5 end 6 end 7 end 8end
- いくつかの方法でrenderを明示的に記載
app/controllers/api/v1/users_controller.rb
ruby
1class API::V1::UsersController < ApplicationController 2 before_action :set_user, only: %i[show] 3 4 def show 5 render :template => "users/show.json.jb" 6 render :template => "api/v1/users/show.json.jb" 7 render "users/show.json.jb" 8 render "api/v1/users/show.json.jb" 9 # などなど、上記は1つずつ試しました 10 end 11 12 private 13 14 def set_user 15 @user = User.find(params[:id]) 16 end 17end
JSONシリアライザを使うのが初めてで、あまり使い方をよく分かっておらず調べても解決できませんでした。
お力をお貸しいただけると幸いです。よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
OS: macOS Big Sur Version 11.4 (intel processor)
Docker: Docker version 20.10.21
docker-compose: Docker Compose version v2.13.0
Ruby: 3.1.2
Rails: 7.0.4
gem 'jb': 0.8.0

回答1件
あなたの回答
tips
プレビュー