为什么不将 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_itemname。所以问题在于 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_optionsnil – 据我了解代码,只有在您不小心错误地覆盖它时才有可能方法。所以我建议仔细检查 PgSearch.multisearch_options 的全局设置以确保它确实已设置。

检查设置的最简单方法是使用调试器或将 puts PgSearch.multisearch_optionsRails.logger.info 'PgSearch.multisearch_options' 之类的东西直接放入失败调用上方的控制器中。