2012-06-03 3 views
3

Я хочу отправить запрос на получение с помощью тела JSON (для поиска) с помощью Faraday, но я получаю вышеуказанную ошибку. Я думал, что self внутри Proc все испортил, но это не имело к этому никакого отношения. Я следую документации на странице [faraday github] [1], но застрял на этом.NoMethodError: undefined метод `split 'для # <Proc: ...> с Faraday

def perform_query 
    response = self.database.connection.get do |request| 
    request.url self.path 
    request.headers['Content-Type'] = 'application/json' 
    request.body(self.to_json) 
    end 
end 

def terms_to_json 
    terms_array = self.terms.keys.inject([]) do |terms_array, field| 
    value = self.terms[field] 
    terms_array.tap do |ary| 
     if value 
     ary << "\"#{field}\": \"#{value}\"" 
     end 
    end 
    end 

    "{ #{terms_array.join ','} }" 
end 

def to_json 
    "{ \"queryb\" : #{self.terms_to_json} }" 
end 

Вот трассировки стека, с ошибка приходит где-то в ГЭТ Proc в #perform_query:

from /Users/chrismaddox/.rvm/gems/ruby-1.9.3-p125/gems/faraday-0.8.1/lib/faraday/request.rb:60:in `url' 
    from /Users/chrismaddox/.rvm/gems/ruby-1.9.3-p125/gems/faraday-0.8.1/lib/faraday/connection.rb:219:in `block in run_request' 
    from /Users/chrismaddox/.rvm/gems/ruby-1.9.3-p125/gems/faraday-0.8.1/lib/faraday/connection.rb:237:in `block in build_request' 
    from /Users/chrismaddox/.rvm/gems/ruby-1.9.3-p125/gems/faraday-0.8.1/lib/faraday/request.rb:35:in `block in create' 
    from /Users/chrismaddox/.rvm/gems/ruby-1.9.3-p125/gems/faraday-0.8.1/lib/faraday/request.rb:34:in `tap' 
    from /Users/chrismaddox/.rvm/gems/ruby-1.9.3-p125/gems/faraday-0.8.1/lib/faraday/request.rb:34:in `create' 
    from /Users/chrismaddox/.rvm/gems/ruby-1.9.3-p125/gems/faraday-0.8.1/lib/faraday/connection.rb:233:in `build_request' 
    from /Users/chrismaddox/.rvm/gems/ruby-1.9.3-p125/gems/faraday-0.8.1/lib/faraday/connection.rb:218:in `run_request' 
    from /Users/chrismaddox/.rvm/gems/ruby-1.9.3-p125/gems/faraday-0.8.1/lib/faraday/connection.rb:87:in `get' 
    from /Users/chrismaddox/Dropbox/LivingSocial/Hungry Academy/Projects/hackchat/search_ruby/elastic.rb:83:in `method_missing' 
    from /Users/chrismaddox/Dropbox/LivingSocial/Hungry Academy/Projects/hackchat/search_ruby/elastic.rb:112:in `perform_query' 
    from /Users/chrismaddox/Dropbox/LivingSocial/Hungry Academy/Projects/hackchat/search_ruby/elastic.rb:61:in `send_query' 

UPDATE:

метод путь возвращает строку пути к поиску для данного индекса. Например /wombats/animals/_search

Упругие :: База данных # путь требует Упругие :: Индекс # index_path:

module Elastic 
    ELASTIC_URL = "http://localhost:9200" 


    class Index 
    attr_reader :index_name, :type_name, :last 

    def initialize(type) 
     @index_name = "#{type}-index" 
     @type_name = type 
     @last = 0 
     add_to_elastic 
    end 

    def add_to_elastic 
     index_url = URI.parse "#{ELASTIC_URL}#{index_path}/" 
     Connection.new(index_url).put() 
    end 

    def index_path 
     "/#{self.index_name}" 
    end 

    def search_path 
     "#{type_path}/_search/" 
    end 

    def type_path 
     "#{self.index_path}/#{type_name}/" 
    end 

    end 
end 
+1

Судя по стеку, ваш метод 'path' может возвращать что-то подозрительное. На что это похоже? –

+0

Хорошо, я добавил методы пути к вопросу – Chris

+0

Может быть, лучше опубликовать то, что содержит *, а не код для его создания. – Makoto

ответ

1

Вызов search_path = "#{type_path}/_search/" ПРИЗЫВ К type_path = "#{self.index_path}/#{type_name}/" ПРИЗЫВ К index_path = "/#{self.index_name}"

Так что, если имя индекса - вомбат, а имя типа - животное, значение_ search_path равно /wombat/animal//_search

Получается, что thi s не была проблемой, показывающей ошибку, но была вызвана тем, что методы Фарадея несовместимы. Faraday::Request#url и Faraday::Request#headers сами являются методами сеттера, тогда как Faraday::Request#body= - это метод сеттера для тела.