2013-06-29 1 views
5

Я использую активный ресурс для получения данных из API и отобразить его,
Мой контроллер model.rb имеетАктивный ресурс жалуясь ожидает хэш

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 

Когда я называю это Thr :: Том :: Dom.find метод возвращает следующее сообщение об ошибке:

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

АНИ, как ожидается, кормить-то вроде этого

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

для звонка, который я сделал.

API возвращает правильный хэш, но я предполагаю, что активный ресурс не может его правильно прочитать, он непосредственно считывает значение в паре ключа-значения хэша.

Я хочу исправить эту ошибку «ArgumentError», я хочу отобразить содержимое возвращенного хэша в представлении.

+0

Пожалуйста, дайте мне знать, если это имеет смысл сейчас? – sorabh

+0

Вы не задали вопрос. Вы сделали несколько заявлений о том, что происходит - не могли бы вы объяснить, что это не так, или вам нужна помощь? Благодарю. –

+0

О, я очень сожалею об этом. Позвольте мне снова задать вопрос. – sorabh

ответ

0

API возвращает объект JSON, а не хеш-символ Ruby. Вам нужно, чтобы преобразовать его в хэш с помощью 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"]}') 

Это возвращает хэш, и тогда вы увидите, что пара ключ/значение будет работать, как ожидалось:

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

Можете ли вы рассказать подробнее об этом, с моим небольшим пониманием в отношении рельсов, которые я думал, что активный ресурс уже делает это для меня. – sorabh

15

Вы можете изменить ActiveResource обрабатывать JSON ответ с

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

В 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 

Если вы пройдете self.format = ::JsonFormatter.new(:categories), он найдет и удалит categories корневой элемент вашего json, возвращенный вашим API.

+0

Я использую этот способ, но в моей модели есть ошибка Неинициализированная константа JsonFormatter –

+1

Вам нужно его вручную или добавить 'config.autoload_paths + =% W (# {config.root}/lib)' in 'config/application.rb ' –

+0

спасибо, что проблема решена –