Q&A
前提
先日、「【Rails7】gem 'jb'を使用してのJSONデータ返却ができない」という質問をさせていただきました。
https://teratail.com/questions/hv4ojicg073fvz
gemを入れるとscaffoldにて.jbファイルを含めて自動生成されるみたいなのでそれを試してみてはどうかという提案をいただいたので、試したところ以下のようなファイルが自動生成されてJSONデータが返却できました。
実行したscaffoldコマンド
rails g scaffold API/V1/Book first_name:string last_name:string
自動生成されたファイル
config/routes.rb
ruby
1 namespace :api do 2 namespace :v1 do 3 resources :books 4 end 5 end
app/controllers/api/v1/books_controller.rb
ruby
1class API::V1::BooksController < ApplicationController 2 before_action :set_api_v1_book, only: %i[ show update destroy ] 3 4 # GET /api/v1/books 5 def index 6 @api_v1_books = API::V1::Book.all 7 8 render json: @api_v1_books 9 end 10 11 # GET /api/v1/books/1 12 def show 13 render json: @api_v1_book 14 end 15 16 # POST /api/v1/books 17 def create 18 @api_v1_book = API::V1::Book.new(api_v1_book_params) 19 20 if @api_v1_book.save 21 render json: @api_v1_book, status: :created, location: @api_v1_book 22 else 23 render json: @api_v1_book.errors, status: :unprocessable_entity 24 end 25 end 26 27 # PATCH/PUT /api/v1/books/1 28 def update 29 if @api_v1_book.update(api_v1_book_params) 30 render json: @api_v1_book 31 else 32 render json: @api_v1_book.errors, status: :unprocessable_entity 33 end 34 end 35 36 # DELETE /api/v1/books/1 37 def destroy 38 @api_v1_book.destroy 39 end 40 41 private 42 # Use callbacks to share common setup or constraints between actions. 43 def set_api_v1_book 44 @api_v1_book = API::V1::Book.find(params[:id]) 45 end 46 47 # Only allow a list of trusted parameters through. 48 def api_v1_book_params 49 params.require(:api_v1_book).permit(:first_name, :last_name) 50 end 51end
app/views/api/v1/books/show.json.jb
ruby
1{ 2 id: @api_v1_book.id, 3 first_name: @api_v1_book.first_name, 4 last_name: @api_v1_book.last_name, 5 created_at: @api_v1_book.created_at, 6 updated_at: @api_v1_book.updated_at 7}
実現したいこと
gem 'jb'を使用して、指定した属性のみJSONデータとして返却したいです。
jb: https://github.com/amatsuda/jb
今の状態では、上記show.json.jbファイル内のcreated_at等を削除してもJSONデータとしてはcreated_atを含む全ての属性が返却されています。恐らくviewを使えておらず、DBから受け取ったデータをそのままJSONデータとして返却していると考えています。
エラーメッセージ
なし
試したこと
実は前回の質問をする前に、今回のscaffoldを用いた方法と同様の方法でJSONデータは返却できていました。よって、前回の質問と同様、以下の内容を試しています。
-
「gem jb 使い方」いくつか検索して1~2ページ目に表示される関連するページに書かれている内容は大体試しました
-
公式ページを確認 https://github.com/amatsuda/jb
-
routes.rbにdefault: { format: 'json' }を追加してrenderを明示的に記載する
ruby
1Rails.application.routes.draw do 2 namespace :api, default: { format: 'json' } do 3 namespace :v1 do 4 resources :books, only: %i[show] 5 end 6 end 7 end 8end
- いくつかの方法でrenderを試す
app/controllers/api/v1/books_controller.rb
ruby
1class API::V1::BooksController < ApplicationController 2 before_action :set_book, only: %i[show] 3 4 def show 5 render :template => "books/show.json.jb" 6 render :template => "api/v1/books/show.json.jb" 7 render "books/show.json.jb" 8 render "api/v1/books/show.json.jb" 9 # などなど、上記は1つずつ試しました 10 end 11 12 private 13 14 def set_book 15 @book = Book.find(params[:id]) 16 end 17end
前回の質問で、どこにどういったファイルを作成するのが正しいのかということは分かりましたが、想定のJSONデータがまだ返却できません。
基本的なことなのでお恥ずかしいのですが、2日間ほどいろいろ試しましたが行き詰まってしまいました。
「こういったことを試してみてはどうか」等のご意見も参考にさせていただきたいので、よろしくお願いいたします。
補足情報(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件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2023/01/14 04:00
2023/01/14 04:07
2023/01/16 02:08