从其他域Rails JSON数据?

时间:2014-06-26 20:54:51

标签: ruby-on-rails ruby json

我正在尝试从其他域获取JSON数据。我用了这段代码:

class EMPInfoController < ApplicationController
require 'httparty'

 def empdata 
  uri = HTTParty.get("http://www.somesite.com/jsondata/xyz")
  resp = JSON.parse(uri.body)
  @empdata = resp
 end

end

我能够将JSON数据解析为resp但是当我将其推送到@empdata并尝试使用JavaScript时,它似乎找不到正确的键/哈希。

有没有办法解剖JSON哈希并获取输出?

JSON Data - resp
{
 "empid123456": {
    "first_name": "john",
    "last_name": "doe",
    "title": "mr",
    "age": "32",
    "blood_group": "B+"
 }
}

我可以通过将其移至@EmpData并使用@EmpData[:first_name]稍后在视野中进行检索来获取它吗?

我是Rails的新手,需要对项目的每一步都有一些指导。

2 个答案:

答案 0 :(得分:0)

将您的JSON数据包装在Ruby类中,并将其作为app/models/json_data.rb放在“models”目录中:

class JsonData
  attr_reader :emp

  def initialize(attributes)
   @emp = attributes[:emp]
  end

  def self.from_json(json_string)
    parsed = JSON.parse(json_string)
    emp = Emp.new(parsed['empid123456'])
    new(:emp => emp)
  end
end

emp创建一个Active Model类,并将其放在app/models/emp.rb

class Emp
  include ActiveModel::Serializers::JSON
  include ActiveModel::Validations
  ATTRIBUTES =  [:first_name, :last_name, :title, :age, :blood_group]
  attr_accessor *ATTRIBUTES
   ###add your activemodel validations here ###

  def initialize(attributes = {})
    self.attributes = attributes
  end

  def attributes
    ATTRIBUTES.inject(
    ActiveSupport::HashWithIndifferentAccess.new
    ) do |result, key|
      result[key] = read_attribute_for_validation(key)
      result
    end
  end

  def attributes= (attrs)
    attrs.each_pair {|k, v| send("#{k}=", v)}
  end

  def read_attribute_for_validation(key)
    send(key)
  end
end

在您的控制器中,您现在可以执行此操作:

def empdata 
  uri = HTTParty.get("http://www.somesite.com/jsondata/xyz")
  @empdata = JsonData.from_json(uri.body)
end

在您的视图中,您可以使用:

@empdata.first_name
@empdata.last_name 

检索相应的值。

答案 1 :(得分:0)

找到了解决方案..谢谢@pette

@first_name = []
@last_name = []
@title = [] 
@age = []
@blood_group = []
thixjs = "#{emp}.json"
resp.each do |key_category, group_category|
  group_category.each do |key,val|
    if group_category.is_a? Array
      eval("@#{key}") << val
    elsif group_category.is_a? Hash
      if key == thixjs
      else
        eval("@#{key}") << val
      end
    end
  end
end

然而,这需要时间来解决,但现在它会这样做。

再次感谢。