2016-12-24 2 views
-2

Здравствуйте, я не могу понять, в чем причина ошибки при поиске Sphinx. Контроллер:NoMethodError, undefined method

class SearchesController < ApplicationController 
def show 
    @results = Search.get_results(params[:query], params[:context]) 
end 
end 

Модель:

class Search < ApplicationRecord 
    CONTEXTS = ['Questions', 'Answers', 'Comments', 'Users'] 

    def get_results(query, context) 
    query = ThinkingSphinx::Query.escape(query) 
    klasses = [context.singularize.constantize] if CONTEXTS.include?(context) 
    @results = ThinkingSphinx.search(query, classes: klasses, order: 'model_order ASC') if query.present? 
    end 
end 

Ошибка: NoMethodError в SearchesController # шоу,

undefined method `get_results' for Search(id: integer, created_at: datetime, updated_at: datetime):Class 

при использовании в себя в методе

def self.get_results(query, context) 
# ... 
end 

в ошибка будет: не определен метод `GSUB» для ноль: NilClass в строке

query = ThinkingSphinx::Query.escape(query) 

Я начинающий ... но я не могу понять .. возможно Sphinx установлен неправильно

Спасибо заранее!

+2

вы знаете, что не показываете нам, где вы используете 'gsub' – MZaragoza

ответ

1

Это две разные ошибки.

Первый заключается в том, что вы определяете метод экземпляра, но используете его в классе (а не в экземпляре). Метод класса начинается self Е.Г.

def self.my_method_name 

и могут быть вызваны на основной класс, например Search.my_method_name вместо конкретного экземпляра класса поиска. Пример вызова метода экземпляра с тем же именем будет:

my_search = Search.new(:some => :attributes) 
my_search.my_method_name 

SO, ваше первое сообщение об ошибке говорит вам «нет метода называется get_results на Search класса» - и это потому, что вы определили его как def get_results вместо def self.get_results

Итак, вы попытались добавить self., и эта ошибка исчезла.

После этого была выставлена ​​следующая ошибка, которая полностью не связана с первой.

Вторая ошибка связана с тем, что вы вызываете gsub на ноль.

gsub, вероятно, что-то происходит внутри вызова ThinkingSphinx::Query.escape(query).

и вы не можете (легко) изменить что-либо внутри другой библиотеки ... но вы все еще можете извлечь полезную информацию из сообщения об ошибке. В этом случае ошибка заключается в том, что вы вызываете метод на nil ... это означает, что что-то есть nil, что он ожидал быть не-ноль.

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

Возможно, он ожидает, что запрос * NOT * будет нулевым.

и все же в этом случае это так.

Что делать, если ...

а) кто-то нажимает кнопку "Go" без ввода поискового запроса-?

b) вы случайно сделали опечатку в имени параметра в своей форме, и поэтому ничего не происходит для params[:query]?

с) вложенности ваших Params немного отличается от того, что вы ожидаете (например params[:search_form][:query])

Во-первых - вы должны перепроверить, что ваши формы отправки через params, что ваш контроллер фактически ожидает. Вы можете сделать это, посмотрев в журналах -> в окне терминала/консоли или в ваших файлах журналов (обычно log/development.log) и наблюдая, что происходит, когда вы нажимаете кнопку отправки в своей поисковой форме. В журналах будут перечислены параметры, которые появляются при отправке этой формы, и вы можете дважды проверить, что это именно то, что вы ожидаете.

Во-вторых: вы, вероятно, не должны выполнять поиск, если запрос не возникает - люди случайно ударят по кнопке отправки, даже если они не набрали что-то - и это было бы более приятным графическим интерфейсом, если бы ваше приложение не взрываются, когда это случается :)

Вы могли бы сделать что-то вроде этого:

def self.get_results(query, context) 
    return nil unless query.present? 
    # ... the rest of the method here 
end 

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

Смежные вопросы