https://teratail.com/questions/180394#reply-268458
の続きです。
controllerで
@itemsをviewに渡して
viewでjbuilderを利用してitem.user情報をnestで表示しようとしてます。
最終的に以下のようなjsonを作りたいです。
item: { id: xx user: { origin_image_url: xxx } }
userは更にshrine(like carrierwave)を使っていて
item.user.image_url(:original)
上記の方法でuserのプロフィールイメージURLを特定できまして
itemとこのitem.userのimage_urlを取得したいです。
ただ、binding.pryを使うときには上記の値が取得できますが、使わない場合取得できませんでした。
binding.pryを使った場合
viewで以下のようにbinding.pryして
index.json.builder
json.array! @items do |t| json.id t.id binding.pry end
pry consoleで
t.user.image_url(:original)
を実行するとイメージURLが取得できました
binding.pryを使わない場合
index.json.builder
json.array! @items do |t| json.id t.id json.user_original_img t.user.image_url(:original) end
すると
Rendered api/items/index.json.jbuilder (30.1ms) Completed 500 Internal Server Error in 43ms (ActiveRecord: 2.4ms) ActionView::Template::Error (undefined method `image_url' for nil:NilClass):
エラーが出てしまいます
なお、userそのものは取得できました
json.array! @items do |t| json.id t.id json.user_info t.user end
result:
{ "id": 50, "user_info": { "id": 10, "provider": "email", "uid": "pepe@naver.com", "allow_password_change": false, "name": "pepe", "nickname": null, "image": { "id": "user/10/image/xx.jpg", "storage": "cache", "metadata": { "filename": "xx.jpg", "size": 764083, "mime_type": "image/jpeg", "width": 1280, "height": 960 } } } },
なにか良い方法がありましたら教えていただけますか。
その他設定はこちらに記載します。
model設定
app/models/item.rb
belongs_to :user
app/models/user.rb
has_many :item
controllerの設定
@items = Item.includes(:user).page(params[:page] ||= 1).per(8).order('created_at DESC') render 'index', formats: 'json', handlers: 'jbuilder'
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。