Это две разные ошибки.
Первый заключается в том, что вы определяете метод экземпляра, но используете его в классе (а не в экземпляре). Метод класса начинается 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
Просто убедитесь, что ваша точка зрения явно проверяет наличие нуля и не взрывается в этом случае.
вы знаете, что не показываете нам, где вы используете 'gsub' – MZaragoza