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

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

新規登録して質問してみよう
ただいま回答率
85.42%
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回答

1018閲覧

【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/13 13:10

前提

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ページ目に表示される関連するページに書かれている内容は大体試してみましたが、エラーが発生します。具体的には以下のようなことを試しました。

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

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

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

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

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

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

yuma.inaura

2023/01/13 14:10

gemを入れるとscaffold で jbファイルまで自動生成してくれるみたいですね そこからやってみても良いかも
Utsubo

2023/01/13 22:01

確かにそうでした!!その方法で試すということがすっかり抜け落ちておりました。 ありがとうございます。早速試してみたいと思います。
Utsubo

2023/01/13 23:39 編集

scaffoldで自動生成したところ、JSONデータの返却方法がわかりました! ただ、controller内で app/controllers/api/v1/users_controller.rb ``` def index @books = Book.all render json: @books end ``` のようにして、直接JSONを返しているように見えます。 view内では app/views/books/show.json.jb ``` { id: @book.id, first_name: @book.first_name, last_name: @book.last_name, created_at: @book.created_at, updated_at: @book.updated_at } ``` となっていますが、created_atの行を消してみても、JSONデータとしては返却されているので、viewはまだ想定通りに動いていないです。 ただ、本質問から外れてしまいますので本質問の件については完了とさせていただきます。 本件について、yuma.inauraさんをベストアンサーとさせていただきたいのですが、質問へのコメントだとできないのでしょうか。回答欄に同様のことを書いていただければ、それをベストアンサーとさせていただきます。不要でしたら、後ほど自分で自己解決欄に教えていただいた解決方法を書いていきます。 解決方法を提案していただきありがとうございました!
yuma.inaura

2023/01/14 04:11

回答に転記しました!
Utsubo

2023/01/14 04:13

承知しました、ベストアンサーとさせていただきます。 改めて、ご指摘いただきありがとうございました!
guest

回答1

0

ベストアンサー

gemを入れるとscaffold で jbファイルまで自動生成してくれるみたいですね そこからやってみても良いかもです

投稿2023/01/14 04:11

yuma.inaura

総合スコア1453

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問