我是Ruby on Rails和编程的新手。到目前为止,我已成功使用我的控制台从API返回JSON数据,但我似乎无法使其在我的本地服务器上运行。
在我输入的控制台中:
httparty "http://rubygems.org/api/v1/versions/httparty.json"
在我设法安装/配置所有内容后它返回了JSON。
然后在控制台中写道:
rails new Catalog
rails generate controller new index
我按照教程在我去的时候让<h1>Hello, Rails!</h1>
显示在我的页面上:
http://localhost:3000/
现在我正在尝试返回JSON数据,并在同一页面上显示“Hello,Rails”。
在index.html.erb中我有:
<h1>Hello, Rails</h1>
<%= @result %>
在home_controller.rb中我有:
class HomeController < ApplicationController
def get_catalog
include HTTParty
@result = HTTParty.get("http://rubygems.org/api/v1/versions/httparty.json")
end
end
在routes.rb中我有:
Catalog::Application.routes.draw do
get "home/index"
root :to => 'home#index'
end
当我转到页面时,“Hello,Rails”下面没有任何内容。
我仍然试图围绕所有这些东西如何相互作用。也许有人能看到我在这里做错了吗?
---更新 我正在尝试将产品名称输出到li元素中。我的文件现在是:
index.html.erb:
<ul>
<% @http_party_json.each do |event| %>
<% event.each do |e| %>
<li><%=h e['Products']['Name'] %></li>
<% end %>
<% end %>
</ul>
控制器:
class HomeController < ApplicationController
def index
@response = HTTParty.get("myURL")
@http_party_json = JSON.parse(@response.body)
end
end
我得到的错误是:
undefined method `[]' for nil:NilClass
Extracted source (around line #5):
2: <ul>
3: <% @http_party_json.each do |event| %>
4: <% event.each do |e| %>
5: <li><%=h e['Products']['Name'] %></li>
6: <% end %>
7: <% end %>
8: </ul>
当我取消['Name']时,我从JSON开始:
[{"Name"=>"3x4 Vinyl Magnet", "Description"=>"Made of durable high-gloss vinyl. Measures 3x4 inches and has rounded corners. Waterproof and scratch resistant."
为什么我无法定位['Name']来获取产品名称?
答案 0 :(得分:6)
HTTParty为您解析XML / JSON响应。只需使用parsed_response
即可获得它:
@response = HTTParty.get("URL").parsed_response
答案 1 :(得分:3)
HTTParty.get
返回HTTParty::Response
类型的对象,该对象记录在HTTParty中(查看示例。)
HTTParty::Response
上有一个名为`#parsed_response的好助手方法。这将返回解析为哈希或数组的JSON字符串:
HTTParty.get("URL").parsed_response
或者,为了获取此消息的正文,您可以致电@result.body
。这将返回一个字符串,您可以像以前一样安全地输出到您的页面。但是,我猜你想用它做更多的事情,而不仅仅是把它输出到一个页面。
为了将其解析为hash /数组,您可以使用/操作/返回真正的JSON,您可以执行以下操作:
http_party_json = JSON.parse(@response.body)
因此,如果您希望能够返回JSON,您可以在控制器中执行以下操作:
@response = HTTParty.get("http://rubygems.org/api/v1/versions/httparty.json").parsed_response
respond_to do |format|
format.json { render :json => JSON.parse(@result) }
format.html { render "index.html.erb" }
end
根据您的最新信息更新了答案:
似乎e['Products']
返回一个数组(注意外面的方括号。)所以,如果你只想要一个你可以做的:
e['Products'][0]['Name']
如果它可能会返回多个产品,您可能需要考虑许多产品的可能性并使用each
块:
e['Products'].each do |product|
#do something with product['Name']
end
这取决于您对该应用的需求。