虽然我在数据库中有记录,但是它给出了“Mongoid :: Errors :: DocumentNotFound”

时间:2014-12-21 04:53:10

标签: mongodb mongoid ruby-on-rails-4.2

虽然我有id 13163(db.locations.find({_id: 13163}))的记录,但它给了我错误:

位置控制器中的

Mongoid :: Errors :: DocumentNotFound#show

  

问题:找不到ID为13163的类位置的文档。   简介:使用id或id数组调用Location.find时   参数必须与数据库中的文档匹配,否则将出现此错误   提高。搜索的是id(s):13163 ...(总共1个)和   未找到以下ID:13163。解决方案:搜索ID   在数据库中或设置Mongoid.raise_not_found_error   配置选项为false,这将导致返回nil   而不是在搜索单个ID时引发此错误,或仅   搜索倍数时匹配的文档。

# Use callbacks to share common setup or constraints between actions.
def set_location
  @location = Location.find(params[:id])
end

locations_controller.rb:

class LocationsController < ApplicationController
  before_action :set_location, only: [:show, :edit, :update, :destroy]

  # GET /locations
  # GET /locations.json
  def index
    @locations = Location.all
  end

  # GET /locations/1
  # GET /locations/1.json
  def show
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_location
      @location = Location.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def location_params
      params.require(:location).permit(:loc_name_en, :loc_name_jp, :channel)
    end
end

设置选项raise_not_found_error: false并非如此,因为我在数据库中有文档。


SOLUTION:

非常感谢@mu is too short给我一个提示。

问题可以通过两种方式解决:

  1. 在模型field :_id, type: Integer
  2. 中声明location.rb
  3. 或者将传递参数转换为Location.find(params[:id].to_i)中的locations_controller.rb整数,如下所示 @mu太短的答案

1 个答案:

答案 0 :(得分:3)

我猜你有类型问题。你这么说:

db.locations.find({_id: 13163})

在MongoDB shell中查找文档。这意味着您在locations集合中有一个文档,其_id数字 13163。如果您使用字符串'13163&#39;:

db.locations.find({_id: '13163'})

您无法找到您的文档。 params[:id]中的值可能是一个字符串,因此您要说:

Location.find('13163')

当你想说:

Location.find(13163)

如果_id确实是一个号码,那么您需要确保使用号码拨打find

Location.find(params[:id].to_i)

你可能会感到困惑,因为有时Mongoid会在StringMoped::BSON::ObjectId之间进行转换(有时它会赢得),所以如果你的_id是通常的ObjectId你可以说:

Model.find('5016cd8b30f1b95cb300004d')

和Mongoid会将该字符串转换为ObjectId。 Mongoid不会为您将String转换为数字,您必须自己做。