【问题标题】:Ruby on Rails - Show external JSON code in viewRuby on Rails - 在视图中显示外部 JSON 代码
【发布时间】:2018-07-07 16:38:59
【问题描述】:

我从外部API 服务(我正在使用)获得这个外部JSON

{
    "result": {
        "2332860": {
            "id": 2332860,
            "name": "NAME 1",
            "capping": {
                "quantity": 1,
                "frequency": 1440
            },
            "status": 0,
            "price": 159,
            "publisher_ad_types": []
        },
        "2335970": {
            "id": 2335970,
            "name": "NAME 2",
            "capping": {
                "quantity": 1,
                "frequency": 1440
            },
            "status": 0,
            "price": 159,
            "publisher_ad_types": []
        },
        "2343470": {
            "id": 2343470,
            "name": "NAME 3",
            "capping": {
                "quantity": 1,
                "frequency": 1440
            },
            "status": 0,
            "price": 170,
            "publisher_ad_types": []
        }
    },
    "request_metadata": {
        "limit": 50,
        "offset": 0,
        "count": 11
    }
}

我通过在我的controller 中设置代码来得到这个输出:

api = HTTParty.get("https://api.external-service.com/v2/",headers: {"Authorization" => "api_token_hhs762jh97shakkaa"})

render :json => api

我想做的是能够在我的视图中显示每个

我怎样才能做到这一点?

感谢任何帮助或提示!

【问题讨论】:

  • 我不确定我是否理解;你有一个 JSON 响应,为什么你不能只遍历地图并呈现你想要的任何 HTML?还是您想显示 JSON 本身(如代码块)?
  • 你好@DaveNewton 我已经尝试过使用地图,但由于某种原因,我在我的视图中得到了未定义的地图方法。不知道我是否做错了什么:)
  • 您很可能做到了,但由于我看不到您的屏幕,因此无法提供帮助。
  • @DaveNewton 感谢您的评论。对不起,我错了,我没有收到错误,但我在如何选择每个块和 call 块中的每个元素时遇到问题,例如idname 等。在我看来,我做了@api.map do |line|%p=line,这个仍然向我展示了整个JSON代码,当我做%p=line['name']时我得到错误:没有将字符串隐式转换为整数。所以基本上我现在最大的问题是如何调用/选择每个块上的每个元素,如nameid 等。谢谢你的帮助
  • 这里有一些提示。 1) 在您的控制器或视图中放入binding.pry(或您正在使用的任何内容)并查看数据以查看您拥有的内容。这是一张地图。第一个键是result。你想迭代它。 2)result也是一张地图。如果您在地图上迭代(您想要each,而不是map,顺便说一句,如果您不收集结果),您的块将采用|key, val|,例如ID,以及该键引用的对象。 3) 现在你有了每个结果的值,你可以像val['name'] 一样从中提取东西。 4) REPL 是你的朋友:使用它。

标签: json ruby-on-rails-4 view


【解决方案1】:

(移至答案以进行格式化。)

@api.each 将遍历顶级对象。有两个键/值对:resultrequest_metadata。我不知道您为什么将其直接转换为字符串;它是一个对象,你不想要它的字符串表示。

我不知道您的场景中@api 的类型;如果已经解析,则可以在下面的代码中跳过该步骤。 (它应该在 HTTParty 下默认为 shown in the docs,如果不是,您可以像我一样解析它。我将您的值作为字符串,将其解析为标准哈希(例如,不是 HashWithIndifferentAccess;我不记得 HTTParty 返回了什么),并开始挑选一些值作为示例。

obj    = JSON.parse(s)
result = obj['result']

result.each do |id, val|
  id, name = val['id'], val['name']
  puts "ID:   #{id}"
  puts "Name: #{name}"
end

运行此代码会产生以下结果:

ID:   2332860
Name: NAME 1
ID:   2335970
Name: NAME 2
ID:   2343470
Name: NAME 3

在你看来,你想要的东西更像是(这是现成的),而不是这样做:

<ul>
  <% result.each do |id, val| %>
    <li><%= val['id'] %> - <%= val['name'] %></li>
  <% end %>
</ul>

如果您只关心result,那么这是唯一应该暴露在视图中的东西。如果您有一个表示此数据的域对象,则应在将其传递给视图之前对其进行转换。

请注意,我的代码不是在 Rails 下运行的,但思路完全一样。

(Complete example here.)

【讨论】:

  • 非常感谢@DaveNewton。感谢您花时间:)。完美运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多