2013-06-29 14 views
5

używam aktywny zasób, aby uzyskać dane z API i wyświetlić go,
Mój kontroler model.rb maAktywny zasób narzekają oczekuje 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 

gdy zgłoszę to Thr :: Vol :: metoda Dom.find zwraca następujący błąd:

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"] 

Oczekuje się, że api karmić coś takiego

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

za wykonane połączenie.

Interfejs API zwraca poprawny skrót, ale zasób aktywny nie może go poprawnie odczytać, ponieważ bezpośrednio odczytuje wartość w parze klucz-wartość skrótu.

Chcę naprawić ten błąd "ArgumentError", chcę wyświetlić zawartość zwróconego hash w widoku.

+0

Proszę dać mi znać, czy ma to teraz sens? – sorabh

+0

Nie zadałeś pytania. Złożyłeś kilka oświadczeń na temat tego, co się dzieje - czy mógłbyś wyjaśnić, co jest nie tak, lub potrzebujesz pomocy? Dzięki. –

+0

ohh naprawdę mi przykro z tego powodu. Pozwól mi ponownie zaktualizować pytanie. – sorabh

Odpowiedz

0

Interfejs API zwraca obiekt JSON, a nie wartość mieszania Ruby. Musisz przekonwertować go do mieszania za pomocą modułu JSON Ruby:

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"]}') 

ten powróci hash i następnie zauważysz, że para klucz/wartość będzie działać zgodnie z oczekiwaniami:

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

Czy możesz wyjaśnić więcej na ten temat, z moim małym zrozumieniem o szynach myślałem, że aktywny zasób już to robi dla mnie. – sorabh

15

można zmienić sposób ActiveResource obsłużyć json odpowiedź z

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

W lib/json_formatter.rb

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 

Po przejściu self.format = ::JsonFormatter.new(:categories) znajdzie i usunie element główny categories w swoim jsonie zwróconym przez interfejs API.

+0

Używam tego sposobu, ale w moim modelu występuje błąd niezainicjowana stała JsonFormatter –

+1

Musisz wymagać tego ręcznie lub dodaj 'config.autoload_paths + =% W (# {config.root}/lib)' w 'config/application.rb ' –

+0

dzięki problemowi rozwiązanemu –