【问题标题】:why no implicit conversion of nil into Hash?为什么没有将 nil 隐式转换为 Hash?
【发布时间】:2023-03-30 05:24:01
【问题描述】:

在设置搜索到序列化程序之后! Rails 吐出来了

没有将 nil 隐式转换为 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

【问题讨论】:

  • 错误来自哪一行代码?
  • 似乎是这个:results_query = PgSearch.multisearch(params[:q]).includes([:searchable]).paginate(page: page, per_page: 20)
  • 请提供日志输出(尤其是显示从 HTTP 请求解析的参数的行)和实际的堆栈跟踪,以便可以有效地帮助您。否则真的很难提供帮助。
  • @ClemensKofler ,我添加了堆栈跟踪的屏幕截图。好吗?
  • 我有一个类似的问题,升级 pg_search gem 后解决了

标签: ruby-on-rails json ruby pg-search


【解决方案1】:

由于你的 case 语句没有检查很多值,你总是可以把它变成一个标准的 if/else 语句:

if result_item && result.class.name == 'Post'
    PostSerializer.new(result_item)
else
    raise NotImplementedError
end

【讨论】:

    【解决方案2】:

    嗯,在您提供的屏幕截图中,我们可以看到日志消息指出错误在第 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(&amp;:searchable).map 的输出。

    【讨论】:

      【解决方案3】:

      根据您提供的屏幕截图,我快速检查了源代码。违规行似乎是这一行: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' 之类的内容直接放在失败的调用上方的控制器中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-14
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        相关资源
        最近更新 更多