2012-03-05 10 views
4

Я пытаюсь получить activeresource (на Rails 3.2), работающий с API Freebase, и мне еще не удалась. Как я могу отлаживать рельсы, чтобы узнать, что происходит, и убедиться, что запрос хорошо сформирован?debugging activeresource

Я думаю, что суффикс .json вызывает сбой, но я не знаю, как проверить, что происходит?

Ошибка:

ActiveResource::ResourceNotFound: Failed. Response code = 404. Response message = Not Found. 

Код:

class Freebase < ActiveResource::Base 
    class << self # also tried without this, same result 
    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 


    self.site = "https://www.googleapis.com/freebase/v1/" 
    self.format = :json 

    #https://www.googleapis.com/freebase/v1/search?query=nirvana&indent=true 

    #Freebase.get('search', :query => 'nirvana') 



end 

UPDATE:

Ok так что я нашел две вещи, идет не так ...

1) collection_path Я попытка вытеснения не работает вообще. Она по-прежнему записывает .json на каждый запрос. 2) https://www.googleapis.com:443/freebase/v1/freebases/search.json?query=nirvana После этого освобождает базу ... любые идеи?

Я также попытался это исправить:

Remove .xml extension from ActiveResource request

Но это не удалить суффикс JSON либо.

UPDATE UPDATE:

Добавлена ​​предложить обновление ниже, что дает правильный путь, но теперь я получаю

GET https://www.googleapis.com:443/freebase/v1/search/?query=monkey 
--> 200 OK 2732 (693.3ms) 
NoMethodError: undefined method `collect!' for #<Hash:0x007f9bde674900> 
+2

Является ли activesource мертвым объектом? Я вряд ли найду какую-либо документацию, а то, что существует, - 2 года. И вряд ли существуют какие-либо новые вопросы, связанные с этим? Должен ли я использовать что-то еще? – ere

ответ

4

ActiveResource не умер, но по отношению к ActiveRecord я могу понять, почему вы так думаете , это, безусловно, нелюбимый и малообеспеченный пасынок.

Возможно, вам было бы лучше использовать что-то вроде Faraday_Middleware или HTTPParty. Первое - мое личное предпочтение. Если вы не используете то, что вы делаете, это вытягивание из другого приложения Rails или того, у которого отличное спокойное поведение, такое как Rails (которого нет в Freebase), ActiveResource обычно больше проблем, чем того стоит.

Это, как говорится, вы можете сделать то, что вы хотите без перезаписи каких-либо методов класса, выполнив:

self.site = "https://www.googleapis.com/" 
    self.format = :json 

    def self.search(word) 
    self.find(:all, :from => "/freebase/v1/search/", :params => { :query => word }) 
    end 
+0

Это, кажется, исправляет проблему пути, но теперь я получаю GET https://www.googleapis.com:443/freebase/v1/search/?query=monkey -> 200 OK 2732 (693.3ms) NoMethodError: undefined метод 'collect! ' для # <Хэш: 0x007f9bde674900> – ere

13

Добавить ActiveResource::Base.logger = Logger.new(STDERR) в ваш конфигурационный/application.rb (Rails 3.x).

Вы получите выход как:

POST http://localhost:3000/freebase.json 
--> 201 Created 0 (15.8ms) 

Это показывает, что метод и код ответа ...

+0

Отлично подходит для того, чтобы рассказать мне, что происходит не так, спасибо, но я до сих пор не понимаю почему? – ere

+1

Вы также можете ввести это в командной строке, если вы просто проверяете несколько вызовов. – Will

+3

Можем ли мы печатать какие параметры отправляются? –

1

ActiveResource будет ожидать, что конечная точка, чтобы вернуть данные в строго определенном формате.

В течение длительного времени мы использовали ActiveResource в моей компании для связи между приложениями. Однако в последнее время мы начали склоняться к HTTParty, потому что он выполняет намного меньше магии вуду и, как правило, очень мало упражняется в вытягивании волос.

Вот пример того, как мы используем HTTParty Сейчас:

module CoreResources 
    class Job 
    include HTTParty 
    base_uri Rails.configuration.core_resource_uri 
    basic_auth Rails.configuration.core_resource_user, Rails.configuration.core_resource_password 

    def self.search(entity) 
     get("/api/v1/jobs.json", :query => {:entity_id => entity.id}) 
    end 

    def self.find(id) 
     result = get("/api/v1/jobs/#{id}.json") 
     raise CoreResources::JobNotFound.new if result.response.code == "404" 
     raise "Unexpected response from resource job find: #{result.response.code} #{result.response.to_s}" if result.response.code =~ /^(?:4|5)..$/ 
     result 
    end 
    end 
end 

Проблема ActiveResource в том, что она будет принимать очень специфично созданный JSON или XML-разметки, а также создавать объекты ActiveResource и вложенные объекты, основанные в теме. У этого есть проблемы, вызывающие collect, потому что что-то в ответ json должно было быть отформатировано как перечислимое, и не было (вероятно, родительский узел должен был быть массивом или чем-то, не уверенным), что заставляет его взорваться.

С HTTParty вы получаете коллекцию json-parsed для работы.

Это достаточно легко для меня, чтобы сделать это:

jobs = CoreResources::Job.search(my_entity) 
puts jobs.inspect 

# [{ 
# "id" => 4, 
# "created_by_id" => 12, 
# "description" => "I like pie" 
# }, 
# { 
# "id" => 5", 
# "created_by_id" => 12, 
# "description" => "Mmm, cake" 
# }] 

Что давайте мне задания доступа через простой сбор массив/хэш построить jobs[0].fetch("description"), в отличие от ActiveResource: jobs[0].description. ActiveResource работает медленнее, чтобы навязать эти коллекции, без необходимости занимает память с ними, и предлагает вам дублировать код, который должен быть просто обслуживан конечной точкой в ​​вашей модели ActiveResource (опять же, если вы используете сторонний API, который может быть другого выбора нет, но я никогда не получал ARes для взаимодействия со сторонними API-интерфейсами).

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

Мораль истории: теперь намного больше поклонника HTTParty. Эта конечная точка, вероятно, просто не возвращает данные в правильном формате, и если только ActiveResource не станет хакфестом, чтобы заставить его правильно его прочитать.

+0

Какой URL-адрес для вашей модели ActiveResource? Вы могли бы опубликовать ответ или, по крайней мере, тупиковую версию, если бы это было так, поэтому мы могли видеть, почему ActiveResource не может разобрать его, если вы действительно мертвы при использовании ARes. – nzifnab

1

ActiveResource имеет довольно узкий прецедент. Вероятно, вы захотите использовать более общий интерфейс для работы с Freebase.

Возможно, какой-то код из LinkTV Platform'sFreeBase API может помочь.

1

NoMethodError: undefined method 'collect!' for #<Hash:0x007f9bde674900> ошибка, похоже, проблема на рельсах https://github.com/rails/rails/issues/2318. У меня была аналогичная проблема, но предоставленные хаки не работали, поэтому мне пришлось немного их подстроить, вы можете найти мой ответ here.