2017-09-08 4 views
-1

Rails 4.5 Ruby 2.3.1Rails Httparty JSON params pour sauver

Je reçois JSON d'une API et d'essayer de stocker les éléments suivants dans un modèle CLrates 1. horodatage en temps unix (date) 2. Currency_code (string) 3. quote (valeur monétaire décimale)

Je peux utiliser ce qui suit dans irb après avoir analysé json et savoir comment obtenir les éléments individuellement en utilisant: response ["quotes"]. Comment puis-je générer params être enregistré dans le modèle ci-dessus lorsque le corps est la suivante:

irb(main):036:0> puts response.body 
{ 
"success":true, 
"terms":"https:\/\/xxxxx.com\/terms", 
"privacy":"https:\/\/xxxxx.com\/privacy", 
"timestamp":1504817289, 
"source":"USD", 
"quotes":{ 
    "USDAED":3.672703, 
    "USDAFN":68.360001, 
    "USDCUC":1, 
    "USDCUP":26.5, 
    "USDCVE":91.699997, 
    "USDCZK":21.718701, 
    ............ many more lines removed for brevity 
    "USDZWL":322.355011 
} 

je peux le faire en utilisant un modèle associé distinct, mais très peu idée de créer les params pour sauver un seul table.

Les liens suivants me sont arrivés là et mérite une lecture si vous avez besoin d'informations sur httparty GET (client): 1. http://www.rubydoc.info/github/jnunemaker/httparty/HTTParty/ 2. http://eric-price.net/blog/rails-api-wrapper/ 3. https://www.driftingruby.com/episodes/playing-with-json

La classe et la méthode dans lib /clayer.rb:

class clayer 
    include HTTParty 
    format :json 
    read_timeout 10 

    def self.get_quotes 
    response = HTTParty.get('http://www.nnnnnnn.net/api/live? 
    access_key=nnnnnnnnnn&format=1') 
    end 
end 

J'utilisé RIR je suis encore à apprendre comment gérer cela par rails c. Ce sera appelé dans le contrôleur et enregistré doivent toutefois travailler sur la façon d'obtenir les params du JSON

Merci pour l'aide

OK: après avoir creusé Je pense que je suis sur la bonne voie je reçois la réponse [ « CITATIONS »], boucle à travers eux et construire les params nécessaires sauver chacun à la fin de la boucle

rates = response["QUOTES"] 
rates.each do |k,v| 
    clrate = Realtimerates.new 
    clrate.date = response["timestamp"] 
    clrate.countrycode = "#{k}" 
    clrate.price = "#{v}" 
    clrate.save 
end 

va donner ce un tourbillon

Dans le modèle

class Realtimerate < ActiveRecord::Base 

include HTTParty 
format :json 
read_timeout 5 


def self.get_cl_rates 
    response = HTTParty.get('http://www.mmmmm.net/api/live?access_key="key"&format=1') 
    rates = response["quotes"] 
    rates.each do |k,v| 
     create!(
     date: Time.at(response["timestamp"]), 
     country_code: "#{k}", 
     price: "#{v}") 

    end 

end 

end 

Dans le contrôleur:

def index 
    Realtimerate.get_cl_rates 
    @realtimerates = Realtimerate.all 
end 

Cela fonctionne et montre le dernier GET.

Répondre

0

Vous avez déjà un hash dans votre réponse. Tout ce que vous devez faire maintenant est d'assigner la valeur-clé pertinente aux attributs de votre modèle. par exemple.

clrate = ClRate.new 
res = response.body 
clate.time = res["timestamp"] 
... 
clate.save 
+0

donc j'ai besoin d'un modèle des clés: USDAED, USDAFN, USDCUC, USDCUP ... – giarcnappel

+0

Merci pour la réponse (punny isnt il). J'ai donc besoin d'un modèle de clés: USDAED, USDAFN, USDCUC, USDCUP ... Ensuite, bouclez chaque élément et construisez le hachage des params. Y at-il un moyen de le faire sans connaître la clé et en ajoutant un modèle supplémentaire? Je comprends comment y accéder comme suit et utilisera votre méthode postée pour construire: response ["quotes"] ["USDAED"]. Cela me donne le prix: existe-t-il un moyen de référencer symboliquement la clé? – giarcnappel

+0

Salut votre dernière tentative est sur la bonne voie, mais ne capturera que le dernier code de devise, la paire de valeur. Une solution consiste à enregistrer chaque paire dans un objet, sinon vous avez besoin d'un champ pour chaque code de devise. – EJ2015