我正在嘗試將資料從 API 回應 (JSON) 呈現到我的視圖中。
出于某種原因,我只能訪問頂級物件而沒有任何問題。但是在從嵌套物件中檢索資料時,我的知識是有限的。
如果有人可以幫助我,將不勝感激。
控制器檔案
require 'httparty'
class BlogController < ApplicationController
include HTTParty
def show
id = params[:id]
get("posts/#{id}")
end
def index
get('posts')
end
private
def get(path)
@host = 'api.example.com'
@blog = HTTParty.get('https://' @host '/' path )
@post = HTTParty.get('https://' @host '/' path )
return false if response.status != 200
puts response.body
end
end
視圖.html.erb
<p id="notice"><%= notice %></p>
<h2><%= @post["title"] %></h2>
<p><%= @post["description"] %></p>
<p><%= @post["content"] %></p>
<p><%= @post["heroimage.url"] %></p> <# This here is the problem how to render the url object which is part of "heroimage" parent
我正在使用的 JSON 回應:
{
"id": 1,
"title": "First Post",
"description": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam",
"content": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. \n\n\n\n\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. ",
"author": null,
"created_at": "2021-10-28T21:31:10.445Z",
"updated_at": "2021-11-10T17:54:36.175Z",
"heroimage": {
"id": 1,
"name": "g-000261-g_W2615899_6-ktm-300-exc-637602315686776824.jpg",
"alternativeText": "",
"caption": "",
"width": 2048,
"height": 1536,
"formats": {
"large": {
"ext": ".jpg",
"url": "/uploads/large_g_000261_g_W2615899_6_ktm_300_exc_637602315686776824_a3b44fdf00.jpg",
"hash": "large_g_000261_g_W2615899_6_ktm_300_exc_637602315686776824_a3b44fdf00",
"mime": "image/jpeg",
"name": "large_g-000261-g_W2615899_6-ktm-300-exc-637602315686776824.jpg",
"path": null,
"size": 184.83,
"width": 1000,
"height": 750
},
"small": {
"ext": ".jpg",
"url": "/uploads/small_g_000261_g_W2615899_6_ktm_300_exc_637602315686776824_a3b44fdf00.jpg",
"hash": "small_g_000261_g_W2615899_6_ktm_300_exc_637602315686776824_a3b44fdf00",
"mime": "image/jpeg",
"name": "small_g-000261-g_W2615899_6-ktm-300-exc-637602315686776824.jpg",
"path": null,
"size": 50.69,
"width": 500,
"height": 375
},
"medium": {
"ext": ".jpg",
"url": "/uploads/medium_g_000261_g_W2615899_6_ktm_300_exc_637602315686776824_a3b44fdf00.jpg",
"hash": "medium_g_000261_g_W2615899_6_ktm_300_exc_637602315686776824_a3b44fdf00",
"mime": "image/jpeg",
"name": "medium_g-000261-g_W2615899_6-ktm-300-exc-637602315686776824.jpg",
"path": null,
"size": 110.16,
"width": 750,
"height": 563
},
"thumbnail": {
"ext": ".jpg",
"url": "/uploads/thumbnail_g_000261_g_W2615899_6_ktm_300_exc_637602315686776824_a3b44fdf00.jpg",
"hash": "thumbnail_g_000261_g_W2615899_6_ktm_300_exc_637602315686776824_a3b44fdf00",
"mime": "image/jpeg",
"name": "thumbnail_g-000261-g_W2615899_6-ktm-300-exc-637602315686776824.jpg",
"path": null,
"size": 10.56,
"width": 208,
"height": 156
}
},
"hash": "g_000261_g_W2615899_6_ktm_300_exc_637602315686776824_a3b44fdf00",
"ext": ".jpg",
"mime": "image/jpeg",
"size": 711.13,
"url": "/uploads/g_000261_g_W2615899_6_ktm_300_exc_637602315686776824_a3b44fdf00.jpg",
"previewUrl": null,
"provider": "local",
"provider_metadata": null,
"created_at": "2021-11-10T16:22:27.152Z",
"updated_at": "2021-11-10T16:22:27.169Z"
}
}
如前所述,我正在嘗試顯示網址(這是“英雄形象”下的一級)。
uj5u.com熱心網友回復:
不應該像
@post[:heroimage][:url]
作業?
使用 ruby??,您應該能夠將鍵視為符號。并且 ruby?? 不會在散列中使用點表示法,因此您需要使用方括號。
uj5u.com熱心網友回復:
您必須將回應從 json 轉換為 Hash 并為此使用:
parsed_response = JSON.parse(response.body)
之后它只是一個散列,因此您可以簡單地訪問如下:
parsed_response['heroimage']['url']
我建議在dig這里使用
parsed_response.dig('heroimage', 'url')
如果你想要一個結構化的物件,那么我建議使用RecursiveOpenStruct它將所有欄位作為嵌套物件屬性
structured = RecursiveOpenStruct.new(parsed_response)
structured.heroimage.url
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358386.html
上一篇:創建物件之間關系的表單
