2013-06-29 5 views
5

ich aktive Ressource bin mit Daten aus einem api zu bekommen und es anzuzeigen,
Mein Controller model.rbAktive Ressource beschwerte sich über erwartet einen Hash

class Thr::Vol::Dom < ActiveResource::Base 
    class << self 
    def element_path(id, prefix_options = {}, query_options = nil) 
     prefix_options, query_options = split_options(prefix_options) if query_options.nil? 
     "#{prefix(prefix_options)}#{collection_name}/#{id}#{query_string(query_options)}" 
    end 

    def collection_path(prefix_options = {}, query_options = nil) 
     prefix_options, query_options = split_options(prefix_options) if query_options.nil? 
     "#{prefix(prefix_options)}#{collection_name}#{query_string(query_options)}" 
    end 
    end 

    ActiveResource::Base.site = 'http://10.00.0.00:8888/' 

    self.format = :json 
    self.collection_name= "/vv/test/domains" 

    def self.find 
    x = superclass.find(:one, :from => '/vv/test/domains/2013-06-25T05:03Z') 
    x 
    end 
end 

hat, als ich diesen Aufruf Thr :: Vol :: Dom.find Methode es gibt den folgenden Fehler:

ArgumentError: expected an attributes Hash, 
    got ["0.0.0.0", "1.1.1.1", "2.2.2.2", "3.3.3.3", "4.4.4.4"] 

die api erwartet wird, so etwas wie dieses

{"abs.com":["0.0.0.0", "1.1.1.1", "2.2.2.2", "3.3.3.3", "4.4.4.4"]} 
einzuspeisen

für den Anruf habe ich gemacht.

Die API gibt den richtigen Hash aber ich denke, aktive Ressource nicht in der Lage ist, es richtig zu lesen, wird es direkt den Wert in dem Schlüssel-Wert-Paar des Hash zu lesen.

ich diese „Argument“ Fehler beheben will, ich will in der Ansicht den Inhalt des zurückgegebenen Hash anzuzeigen.

+0

Bitte lassen Sie mich wissen, wenn es jetzt sinnvoll ist? – sorabh

+0

Sie haben keine Frage gestellt. Du hast mehrere Aussagen darüber gemacht, was passiert - kannst du bitte erklären, was falsch ist oder mit dem du Hilfe brauchst? Vielen Dank. –

+0

ohh das tut mir wirklich leid. Lassen Sie mich die Frage erneut aktualisieren. – sorabh

Antwort

0

Die API ist Zurückgeben eines JSON Objekt und keine Hash-Rubin. Sie müssen es in einen Hash konvertieren von Rubys JSON-Modul:

require 'JSON' 

hash = JSON.parse('{"abs.com":["0.0.0.0", "1.1.1.1", "2.2.2.2", "3.3.3.3", "4.4.4.4"]}') 

Dieser einen Hash zurück und dann werden Sie feststellen, dass der Schlüssel/Wert-Paar wird wie erwartet:

hash["abs.com"] => ["0.0.0.0", "1.1.1.1", "2.2.2.2", "3.3.3.3", "4.4.4.4"] 
+1

Kannst du plz mehr darüber erklären, mit meinem kleinen Verständnis von Schienen, dachte ich, dass aktive Ressource dies bereits für mich getan hat. – sorabh

15

können Sie ändern, wie Active json Reaktion mit

class YourModel < ActiveResource::Base 
    self.format = ::JsonFormatter.new(:collection_name) 
end 

In lib/json_formatter.rb

Griff
class JsonFormatter 
    include ActiveResource::Formats::JsonFormat 

    attr_reader :collection_name 

    def initialize(collection_name) 
    @collection_name = collection_name.to_s 
    end 

    def decode(json) 
    remove_root(ActiveSupport::JSON.decode(json)) 
    end 

    private 

    def remove_root(data) 
    if data.is_a?(Hash) && data[collection_name] 
     data[collection_name] 
    else 
     data 
    end 
    end 
end 

Wenn Sie self.format = ::JsonFormatter.new(:categories) übergeben, wird es categories Wurzelelement in Ihrem JSON finden und entfernen, das von Ihrer API zurückgegeben wird.

+0

Ich benutze diesen Weg, aber in meinem Modell haben Fehler nicht initialisierte Konstante JsonFormatter –

+1

Sie benötigen es manuell oder fügen Sie 'config.autoload_paths + =% W (# {config.root}/lib)' in 'config/application.rb ' –

+0

danke Problem gelöst –

Verwandte Themen