你好我无法理解搜索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)
我是初学者...但我无法理解..也许狮身人面像安装不正确
提前致谢!
答案 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,并且在这种情况下不会爆炸。