前提・実現したいこと
VueをSPAとして運用、RailsをAPIモードで開発しています。
JSON形式でレスポンスを返そうとすると、デフォルトでは関連付けされたモデルの情報は取得できません。
そこで、to_jsonメソッドを使い、
ruby
1@user = User.find(params[:id]) 2render json: @user.to_json(include: [:モデル名])
のような形で記述することで、関連するモデルの詳細も取得することができるようになりました。
しかし、ActiveHashというgemを使って作られたモデルは、この方法では取得ができず困っています。
参考:ActiveHash
ActiveHashのデータを展開した状態でレスポンスを返すにはどうすればよいのでしょうか?
発生している問題・エラーメッセージ
binding.pryを使い、コントローラー内で呼び出そうとすると以下のエラーが表示されます。
ruby
1NoMethodError: undefined method `serializable_hash'
ブラウザから取得しようとすると、以下のエラーが返ってきています。
500 (Internal Server Error)
該当のソースコード
ActiveHashのモデルは以下のようになっています。
ruby
1class PokemonData < ActiveHash::Base 2 self.data = [ 3 { 4 "no": 1, 5 "name": "フシギダネ", 6 "form": "", 7 "ranks": [], 8 "evolutions": [2], 9 "types": ["くさ", "どく"], 10 "abilities": ["しんりょく"], 11 "hiddenAbilities": ["ようりょくそ"], 12 "stats": { 13 "hp": 45, 14 "attack": 49, 15 "defence": 49, 16 "spAttack": 65, 17 "spDefence": 65, 18 "speed": 45 19 }, 20 "id": 1 21 }, 22 { 23 "no": 2, 24 "name": "フシギソウ", 25 "form": "", 26 "ranks": [], 27 "evolutions": [3], 28 "types": ["くさ", "どく"], 29 "abilities": ["しんりょく"], 30 "hiddenAbilities": ["ようりょくそ"], 31 "stats": { 32 "hp": 60, 33 "attack": 62, 34 "defence": 63, 35 "spAttack": 80, 36 "spDefence": 80, 37 "speed": 60 38 }, 39 "id": 2 40 }, 41 { 42 "no": 3, 43 "name": "フシギバナ", 44 "form": "", 45 "ranks": [], 46 "evolutions": [], 47 "types": ["くさ", "どく"], 48 "abilities": ["しんりょく"], 49 "hiddenAbilities": ["ようりょくそ"], 50 "stats": { 51 "hp": 80, 52 "attack": 82, 53 "defence": 83, 54 "spAttack": 100, 55 "spDefence": 100, 56 "speed": 80 57 }, 58 "id": 3 59 }, 60 ] 61 62 include ActiveHash::Associations 63 has_many :pokemons 64 65end
続いて、関連付けしたいモデルは以下の通りです。
ruby
1class Pokemon < ApplicationRecord 2 extend ActiveHash::Associations::ActiveRecordExtensions 3 4 belongs_to :pokemon_data 5end
コントローラーは以下の通りです。
class Api::V1::PokemonsController < ApplicationController def show @pokemon = Pokemon.find(params[:id]) render json: @pokemon.to_json(include: [:pokemon_data]) # エラーになる # render json: @pokemon.to_json エラーにならない end end
試したこと
コントローラー内で
ruby
1@pokemon.pokemon_data
とすると、データを取得することはできています。
また、ActiveHashで作られていないモデルであれば、今回の問題は発生しないことも確認しています。
以上のことから、ActiveHashとto_jsonメソッドの相性の問題なのではないか?と考えています。
補足情報(FW/ツールのバージョンなど)
ruby:2.6.5
rails:6.0.3
active_hash (3.1.0)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。