質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

849閲覧

【Rails7】gem 'jb'を使用して、想定のJSONデータ返却ができない

Utsubo

総合スコア15

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2023/01/14 00:36

前提

先日、「【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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

今の状態では、上記show.json.jbファイル内のcreated_at等を削除してもJSONデータとしてはcreated_atを含む全ての属性が返却されています。

⇒どこかの手順が間違っている可能性があります。


以下、手元で試してみた流れです。

  1. 新規プロジェクトで、jbをインストール後、ご提示いただいたscaffoldを実行しました。
  2. newページからデータを保存しました。
  3. http://localhost:3000/api/v1/books/1.json にアクセスすると、下記が表示されました。{"id":1,"first_name":"test","last_name":"1","created_at":"2023-01-14T03:23:42.598Z","updated_at":"2023-01-14T03:23:42.598Z"}
  4. 次にviews/api/v1/books/show.json.jbからcreated_atとupdated_atの2行を削除しました。
  5. http://localhost:3000/api/v1/books/1.json にアクセスすると、下記が表示されました。

{"id":1,"first_name":"test","last_name":"1"}

投稿2023/01/14 03:37

no1knows

総合スコア3365

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Utsubo

2023/01/14 04:00

no1knowsさん、ご丁寧にもお手元で確認していただきありがとうございます。 結果的に問題は解決しました。原因は、scaffoldを実行した際、サーバを立ち上げ直すのを忘れておりました。 Docker上で開発しており、立ち上げ時に自動でサーバを立ち上げるようにしていたため、完全に意識にありませんでした。 新規プロジェクトで実行していただいたおかげで、すぐに原因に気づくことができました。 改めて、ありがとうございます。
no1knows

2023/01/14 04:07

それはよかったです!
Utsubo

2023/01/16 02:08

前回自分の説明に間違いがあったので追記です。 no1knowsさんの回答には問題なく、おかげさま様で先に進めたので気になさらないでください。 APIモードではない場合 (普通にrails newした場合)は、no1knowsさんが書いてくださった通りに実行することで、想定通りのJSONが返されます。 以下はAPIモードの場合にどうjbを実装するかの説明です (ただの情報共有です)。 scaffold実行後にcontrollerのshowアクションを確認すると、 def show render json: @book end となっているので、render json: @api_v1_bookを削除すると、show.json.jbがレンダリングされるようになります。 scaffoldはjbを使うことを想定していないので、上記だとDBから取ってきたデータをそのままレンダリングしてしまうからだと思います。 あと、サーバは立ち上げ直さなくても反映されました...いろいろ実行していたのでたまたまサーバを立ち上げ直したタイミングと上記render json: @api_v1_bookを削除したタイミングが被っただけだと思います。 ちなみに、.jsonをつけたくない場合は、routes.rbに以下のようにdefaults: { format: 'json' }をつけると、.jsonをつけなくてもJSONデータを返せるようになりました。 Rails.application.routes.draw do namespace :api, defaults: { format: 'json' } do namespace :v1 do resources :users, only: %i[show] end end end
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問