为什么不将 nil 隐式转换为 Hash?
why no implicit conversion of nil into Hash?
设置搜索序列化程序后!
Rails吐出来
no implicit conversion of nil into Hash
所以,请有人指出这段代码有什么问题吗?
class SearchController < ApplicationController
def results
results_query = PgSearch.multisearch(params[:q]).paginate(page: page, per_page: 20)
result = results_query.map(&:searchable).map do |result_item|
case result_item.class.name
when 'Post'
PostSerializer.new(result_item)
else
raise NotImplementedError
end
end
render json: {
items: result,
page: page,
pages: results_query.total_pages
}
end
def page
params[:page] || 1
end
def serialize(data, serializer)
ActiveModel::Serializer::CollectionSerializer.new(data, each_serializer: serializer)
end
end
好吧,在您提供的屏幕截图上,我们可以看到日志消息指出错误在第 5 行。
根据您的代码,第 5 行是:case result_item.class.name
错误信息是TypeError (no implicit conversion of nil into Hash)
。
您正在尝试获取 class
,然后是 result_item
的 name
。所以问题在于 result_item
等于 nil
.
为了解决您的问题,您可能需要检查 results_query.map(&:searchable).map
的输出。
由于您的 case 语句没有检查很多值,因此您始终可以将其变成标准的 if/else 语句:
if result_item && result.class.name == 'Post'
PostSerializer.new(result_item)
else
raise NotImplementedError
end
根据您提供的截图,我很快查看了源代码。违规行似乎是这一行:https://github.com/Casecommons/pg_search/blob/master/lib/pg_search/document.rb#L22。这会引发所描述的 TypeError
的唯一原因是如果 PgSearch.multisearch_options
是 nil
– 据我了解代码,只有在您不小心错误地覆盖它时才有可能方法。所以我建议仔细检查 PgSearch.multisearch_options
的全局设置以确保它确实已设置。
检查设置的最简单方法是使用调试器或将 puts PgSearch.multisearch_options
或 Rails.logger.info 'PgSearch.multisearch_options'
之类的东西直接放入失败调用上方的控制器中。
设置搜索序列化程序后! Rails吐出来
no implicit conversion of nil into Hash
所以,请有人指出这段代码有什么问题吗?
class SearchController < ApplicationController
def results
results_query = PgSearch.multisearch(params[:q]).paginate(page: page, per_page: 20)
result = results_query.map(&:searchable).map do |result_item|
case result_item.class.name
when 'Post'
PostSerializer.new(result_item)
else
raise NotImplementedError
end
end
render json: {
items: result,
page: page,
pages: results_query.total_pages
}
end
def page
params[:page] || 1
end
def serialize(data, serializer)
ActiveModel::Serializer::CollectionSerializer.new(data, each_serializer: serializer)
end
end
好吧,在您提供的屏幕截图上,我们可以看到日志消息指出错误在第 5 行。
根据您的代码,第 5 行是:case result_item.class.name
错误信息是TypeError (no implicit conversion of nil into Hash)
。
您正在尝试获取 class
,然后是 result_item
的 name
。所以问题在于 result_item
等于 nil
.
为了解决您的问题,您可能需要检查 results_query.map(&:searchable).map
的输出。
由于您的 case 语句没有检查很多值,因此您始终可以将其变成标准的 if/else 语句:
if result_item && result.class.name == 'Post'
PostSerializer.new(result_item)
else
raise NotImplementedError
end
根据您提供的截图,我很快查看了源代码。违规行似乎是这一行:https://github.com/Casecommons/pg_search/blob/master/lib/pg_search/document.rb#L22。这会引发所描述的 TypeError
的唯一原因是如果 PgSearch.multisearch_options
是 nil
– 据我了解代码,只有在您不小心错误地覆盖它时才有可能方法。所以我建议仔细检查 PgSearch.multisearch_options
的全局设置以确保它确实已设置。
检查设置的最简单方法是使用调试器或将 puts PgSearch.multisearch_options
或 Rails.logger.info 'PgSearch.multisearch_options'
之类的东西直接放入失败调用上方的控制器中。