无法使用Mongodb在Rails中命中API端点

时间:2017-01-03 15:18:54

标签: ruby-on-rails ruby mongodb

我正在尝试使用Mongodb构建一个Rails后端,它只是一个API应用程序。我有一个事件模型和api控制器,当我去localhost:3000 / events / 2时,我收到404错误,虽然我知道该记录在我的数据库中:

{ "_id" : 2, "name" : "String Cheese", "location" : "Durham, NC", "price" : "40.00" }

我的控制器看起来像这样:

class API::V1::EventsController < ApplicationController
  respond_to :json

  def show
    respond_with Event.find('_id')
  end

  private

  def event_params
    params.require(:event).permit(:name, :url, :location, :dates, :price, :info, :genre, :address, :city, :tags)
  end
end

我的路线看起来像这样:

require 'api_constraints'

Rails.application.routes.draw do

  namespace :api, defaults: { format: :json }, path: '/' do
    scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
      resources :users, only: [:show]
      resources :events, only: [:show]
    end
  end
end

然后我的lib文件夹中有一个api_constraints.rb,如下所示:

class ApiConstraints
  def initialize(options)
    @version = options[:version]
    @default = options[:default]
  end

  def matches?(req)
    @default || req.headers['Accept'].include?("application/vnd.marketplace.v#{@version}")
  end
end

这是为了消除在uri中使用api版本号的需要。我不确定它是否影响了我的终点。

然后,当我启动服务器并转到localhost:3000/events/2时,我收到404错误:

{&#34; status&#34;:404,&#34; error&#34;:&#34; Not Found&#34;,&#34; exception&#34;:&#34;#\ u003cMongoid ::错误:: DocumentNotFound:\ nmessage:\ n找不到包含id(s)的类Event的文档{\&#34; _id \&#34; = \ u003e \&#34; 2 \&# 34;}。\ nsummary:\ n当使用id或数组的id调用Event.find时,每个参数必须与数据库中的文档匹配,否则将引发此错误。搜索的是id(s):{\&#34; _id \&#34; = \ u003e \&#34; 2 \&#34;}

堆栈跟踪实际上甚至更长,因此如果有人需要,我可以发布整个事情。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

Event.find('_id')会查找_id = "_id"的记录。

您需要使用网址中的id参数。

Event.find(params[:id])

答案 1 :(得分:0)

我很抱歉,原因是我通过终端错误地将新记录存储在mongo中。我使用这个错误地写了一个新条目:

db.events.insert( { "_id" : 2, "name" : "Phish" } )

我应该这样做:

db.events.insert( { _id: '2', name: "Phish" } )

我对Mongodb还不是很熟悉,但看起来他们将所有ID都保存为字符串,并且我将ID保存为整数,然后无法找到。