NoMethodError,未定义的方法

时间:2016-12-24 16:03:27

标签: ruby-on-rails sphinx thinking-sphinx

你好我无法理解搜索Sphinx时出错的原因。 控制器:

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

错误:SearchesController#show中的NoMethodError,

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

在方法中用于自我时

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

错误将是:未定义的方法`gsub'代表nil:字符串中的NilClass

query = ThinkingSphinx::Query.escape(query)

我是初学者...但我无法理解..也许狮身人面像安装不正确

提前致谢!

1 个答案:

答案 0 :(得分:1)

这是两个不同的错误。

第一个是您正在定义一个实例方法,但是在类上使用它(而不是在实例上)。类方法从self开始,例如

def self.my_method_name

并且可以在主类上调用,例如Search.my_method_name,而不是搜索类的特定实例。调用具有相同名称的实例方法的示例是:

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

所以,您的第一条错误消息告诉您“get_results类上没有名为Search的方法” - 这是因为您已将其定义为def get_results而不是{{ 1}}

因此,您尝试添加def self.get_results,此错误就消失了。

然后暴露了下一个错误 - 这与第一个错误完全无关。

第二个错误提示您在nil上调用self.

gsub可能是gsub来电中发生的事情。

并且您不能(轻松)更改其他库中的任何内容......但您仍然可以从错误消息中收集有用的信息。 在这种情况下,错误是抱怨你在ThinkingSphinx::Query.escape(query)上调用方法...这意味着某些东西是nil,它预计不会为零。

鉴于这是一个搜索查询的事情......我最好的猜测是假设nil变量是某种字符串...包含搜索查询。

可能期望查询* NOT *为零。

然而在这个例子中它是。

如果......

a)有人点击“go”按钮而没有输入搜索查询?

b)您不小心在表单中的参数名称中输入了拼写错误,因此query实际上没有任何内容出现?

c)你的params的嵌套与你期望的略有不同(例如params[:query]

首先 - 您应该仔细检查您的表单是否通过控制器实际预期的params[:search_form][:query]发送。你可以通过查看日志来做到这一点 - &gt;在终端/控制台窗口或日志文件中(通常为params),并观察当您点击搜索表单上的提交按钮时会发生什么。日志将列出您提交该表单时遇到的参数,您可以仔细检查它是否符合您的预期。

其次:如果没有查询通过,你可能不应该真正进行搜索 - 即使他们没有输入内容,人们也会意外点击提交按钮 - 如果你的应用没有爆炸,它会是一个更好的GUI当发生这种情况时:)

你可以这样做:

log/development.log

请确保您的视图明确检查nil,并且在这种情况下不会爆炸。