我正在尝试使用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;}
堆栈跟踪实际上甚至更长,因此如果有人需要,我可以发布整个事情。
非常感谢任何帮助。
答案 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保存为整数,然后无法找到。