2017-01-03 7 views
0

APIアプリケーションであるMongodbを使ってRailsバックエンドを構築しようとしています。私は、イベントモデルとAPIのコントローラを持っていると私はlocalhostに行くとき:3000 /イベント/ 2、私はレコードが私のデータベース内にある知っているが、私は、404エラーを取得しています:Mongodbを使ってRailsでAPIエンドポイントを打つことができない

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

私のコントローラは、このようになります:

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 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 

そして、私のルートは次のようになり

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エラーを取得:

{ "ステータス":404、 "エラー": "Not Found" や "例外": "#1の\ u003cMongoid: :エラー:DocumentNotFound:\ nmessage:\ nクラスEventのIDが見つかりません(\ "_ id \" = \ u003e \ "2 \")。\ nサマリー:\ nイベントを呼び出すとき。 idまたはIDの配列で検索すると、各パラメータはデータベース内のドキュメントと一致する必要があります。このエラーは発生します:id:s:\ u003e \ "2 \"}

スタックトレースは実際にはさらに長くなるため、誰かが必要な場合は全部を投稿できます。

ご協力いただければ幸いです。

答えて

0

私の謝罪、それは私が間違って私の端子を介してモンゴで新記録を保存していたた理由が判明。私は間違って、この使用して、新しいエントリを書きました:

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

を、私はこのようにそれを行っている必要があります。

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

を私はまだMongoDBを非常に精通していないですが、彼らが保存表示されますすべてのIDを文字列として返し、整数として保存されたIDを見つけられませんでした。

+0

MongoidはデフォルトでIDを 'BSON :: ObjectId'として保存します。文字列ではありません。 https://docs.mongodb.com/ruby-driver/master/tutorials/6.0.0/mongoid-documents/ – max

1

Event.find('_id')は、_id = "_id"でレコードを検索します。

URLからidパラメータを使用する必要があります。

Event.find(params[:id]) 
+0

私はそれにそれを変更したとき、私はまだ404エラーを得た: は、APIによって:: 1処理 -0500午前10時32分00秒2017年1月3日には、「/イベント/ 2」をGET開始:: V1 :: EventsController#show as JSON パラメータ:{"id" => "2"} MONGODB | localhost:27017 | go_loco_development.find |スタート{"find" => "events"、 "filter" => {"_ id" => "2"}} MONGODB | localhost:27017 | go_loco_development.find | SUCCEEDED | 0.000573s 完了した404が2msで見つかりませんでした。 – LBarry

+0

@ Lukas Fixnumに変換しようとしました。質問に含めるドキュメントのIDは、文字列ではなく整数です。 '{" _id ":2 ..... '。だから 'Event.find(params [:id] .to_i)'のようなものです。 – Dani

+0

私は手動でIDを作成するのを避けるでしょう。 'BSON :: ObjectId'のデフォルトのスキームを使ってください。自動インクリメントの列が競合条件の対象となるレプリケートされたデータベースに関しては、単純な数値IDに比べて醜いと思われるかもしれませんが、非常に実際の問題を解決します。 – max

関連する問題