Ruby on rails Ruby on rails、mongoid和Geocoder

Ruby on rails Ruby on rails、mongoid和Geocoder,ruby-on-rails,ruby,geojson,Ruby On Rails,Ruby,Geojson,当我尝试使用geocoder、geojson和rails进行API调用时,出现了这个错误。以下是错误: Showing /Users/<User>/Sites/<Sites>/<Site>/app/views/api/exam_centers/index.json.rabl where line #2 raised: error processing query: ns=db-<site>.exam_centers limit=30Tree: G

当我尝试使用geocoder、geojson和rails进行API调用时,出现了这个错误。以下是错误:

Showing /Users/<User>/Sites/<Sites>/<Site>/app/views/api/exam_centers/index.json.rabl where line #2 raised:

error processing query: ns=db-<site>.exam_centers limit=30Tree: GEONEAR  field=coordinates maxdist=0.00313922 isNearSphere=1
Sort: {}
Proj: {}
 planner returned error: unable to find index for $geoNear query (2)
controller/api/exam\u centers\u controller.rb

class Api::ExamCentersController < ApplicationController
  caches_action :index, :cache_path => Proc.new {|c| c.request.url }, :expires_in => 1.day, :unless => proc { params[:latitude].present? }

  def index
    if params[:latitude].present? && params[:longitude].present?
      radius = if params[:radius].blank?
                 20
               else
                 params[:radius].to_f / 1000
               end
      @center = [params[:latitude], params[:longitude]]
      @exam_centers = ExamCenter.near([params[:latitude], params[:longitude]], radius, units: :km).limit(30)
    end
  end

  def show
    @exam_center = ExamCenter.find params[:id]
  end
end
<div class="map-container">

  <div id="map-exams" class=" hidden-xs hidden-sm" style="<% if !@department.blank?  && params[:city].blank? %> display: none !important;<% end %>" >

    <div class="map-refresh-controls" style="<% if !@department.blank?  && params[:city].blank? %>display: none !important;<% end %>">
      <a id="map-refresh-btn-exam" class="btn btn-primary btn-large hide ">
        <%= fa_icon 'refresh'  %> Relancer la recherche ici
      </a>
      <div class="map-auto-refresh-exam hide">
        <div class="checkbox">
          <label>
            <input class="map-auto-refresh-checkbox" type="checkbox">
            Rechercher quand je déplace la carte
          </label>
        </div>
      </div>
      <div class="map-loader"><i class="icon-spinner icon-spin icon-large"></i> Chargement... </div>
    </div>
  </div>


  <div id="navRightWrapper" style="<% if !@department.blank?  && params[:city].blank? %> width: 100% !important;<% end %>">
    <form class="search-form">
      <div id="navRight-search-box" class="navRight-section input-group">
        <span class="input-group-addon" id="basic-addon1" style="height: 46px !important; padding-top: 14px !important;"><%= fa_icon 'search' %></span>
        <input id="search-box-exam-2" class="form-control input-lg dept_list" placeholder="Où cherchez-vous un centre d'examen" type="text" />
        <!-- suppression id="input_home_large" car -->
      </div>
    </form>
    <div id="navRight-filter-box" class="navRight-section" style="margin-top: 10px !important;">
      <span style="margin-right: 7px">Trier par</span>
      <div class="btn-group" role="group">
        <button class="btn btn-default" type="button" id="sorting_by_la_poste">La Poste </button>
        <button class="btn btn-default" type="button" id="sorting_by_sgs">SGS</button>
        <button class="btn btn-default" type="button" id="sorting_by_codengo">Codengo </button>
      </div>
    </div>
    <div id="navRight-middle">
      <div class="exams-loader hide"><i class="icon-spinner icon-spin icon-large"></i> Chargement...</div>
      <div id="listResultsExams">
        <%= render partial: 'exam_centers/exam_center', collection: @exam_centers %>
      </div>
    </div>
  </div>

</div>

<script id="ExamCenterListTpl" type="text/template">

  {{#features}}

  <div class="entry-line-small" data-position="{{geometry.coordinates}}" data-distance-from-center="{{properties.distance_from_center}}" data-marker="{{properties.title}}" data-name="{{properties.title}}"  data-is-la-poste="{{properties.is_la_poste}}" data-is-sgs="{{properties.is_sgs}}" data-is-codengo="{{properties.is_codengo}}">
    <div class="row">
      <div class="entry-line-small-text tiny col-md-8 col-sm-8">
        <div class="entry-line-small-title">
          <h6 class="title"><a class="exam-centers-listing-title" href="#" data-position="{{geometry.coordinates}}" data-marker="{{properties.title}}">{{properties.title}}</a></h6>
          <div class="listing-address">
            {{properties.adress}} {{properties.zipcode}}  {{properties.city}} {{properties.type}}
          </div>
        </div>
      </div>
    </div>
  </div>
  {{/features}}

</script>

<script id="ExamCenterPopupTpl" type="text/template">
  <strong><a id="exam-center-title-popup-link" href="#">{{ title }}</a></strong>
  <br />
  <div class="listing-address" style="line-height: 11px">
    {{ adress }} {{ zipcode }} {{ city }} {{ type }}
  </div>
</script>


    <%= javascript_include_tag "mapbox.js" %>
views/api/exam\u centers/index.json.rabl

node :type do
  'Feature'
end

node :geometry do |examcenter|
  {
    type: 'Point',
    coordinates: examcenter.coordinates
  }
end

node :properties do |examcenter|
  data = {}

  [:id, :title, :adress, :zipcode, :city, :type, :link].map do |field|
    data[field] = examcenter.send field
  end

  data[:is_la_poste] = examcenter.isLaPoste?
  data[:is_sgs] = examcenter.isSGS?
  data[:is_codengo] = examcenter.isCodengo?

  data.keep_if {|key, value| value.present?}
end
object false

node :type do
  'FeatureCollection'
end


child @exam_centers => :features do
  extends 'api/exam_centers/base'
end


 #collection @exam_centers

 #extends 'api/exam_centers/show'
object @exam_center

attributes :id, :coordinates, :title, :adress, :zipcode, :city, :type, :link
views/api/example\u centers/show.json.rabl

node :type do
  'Feature'
end

node :geometry do |examcenter|
  {
    type: 'Point',
    coordinates: examcenter.coordinates
  }
end

node :properties do |examcenter|
  data = {}

  [:id, :title, :adress, :zipcode, :city, :type, :link].map do |field|
    data[field] = examcenter.send field
  end

  data[:is_la_poste] = examcenter.isLaPoste?
  data[:is_sgs] = examcenter.isSGS?
  data[:is_codengo] = examcenter.isCodengo?

  data.keep_if {|key, value| value.present?}
end
object false

node :type do
  'FeatureCollection'
end


child @exam_centers => :features do
  extends 'api/exam_centers/base'
end


 #collection @exam_centers

 #extends 'api/exam_centers/show'
object @exam_center

attributes :id, :coordinates, :title, :adress, :zipcode, :city, :type, :link
视图/考试中心/index.html.erb

class Api::ExamCentersController < ApplicationController
  caches_action :index, :cache_path => Proc.new {|c| c.request.url }, :expires_in => 1.day, :unless => proc { params[:latitude].present? }

  def index
    if params[:latitude].present? && params[:longitude].present?
      radius = if params[:radius].blank?
                 20
               else
                 params[:radius].to_f / 1000
               end
      @center = [params[:latitude], params[:longitude]]
      @exam_centers = ExamCenter.near([params[:latitude], params[:longitude]], radius, units: :km).limit(30)
    end
  end

  def show
    @exam_center = ExamCenter.find params[:id]
  end
end
<div class="map-container">

  <div id="map-exams" class=" hidden-xs hidden-sm" style="<% if !@department.blank?  && params[:city].blank? %> display: none !important;<% end %>" >

    <div class="map-refresh-controls" style="<% if !@department.blank?  && params[:city].blank? %>display: none !important;<% end %>">
      <a id="map-refresh-btn-exam" class="btn btn-primary btn-large hide ">
        <%= fa_icon 'refresh'  %> Relancer la recherche ici
      </a>
      <div class="map-auto-refresh-exam hide">
        <div class="checkbox">
          <label>
            <input class="map-auto-refresh-checkbox" type="checkbox">
            Rechercher quand je déplace la carte
          </label>
        </div>
      </div>
      <div class="map-loader"><i class="icon-spinner icon-spin icon-large"></i> Chargement... </div>
    </div>
  </div>


  <div id="navRightWrapper" style="<% if !@department.blank?  && params[:city].blank? %> width: 100% !important;<% end %>">
    <form class="search-form">
      <div id="navRight-search-box" class="navRight-section input-group">
        <span class="input-group-addon" id="basic-addon1" style="height: 46px !important; padding-top: 14px !important;"><%= fa_icon 'search' %></span>
        <input id="search-box-exam-2" class="form-control input-lg dept_list" placeholder="Où cherchez-vous un centre d'examen" type="text" />
        <!-- suppression id="input_home_large" car -->
      </div>
    </form>
    <div id="navRight-filter-box" class="navRight-section" style="margin-top: 10px !important;">
      <span style="margin-right: 7px">Trier par</span>
      <div class="btn-group" role="group">
        <button class="btn btn-default" type="button" id="sorting_by_la_poste">La Poste </button>
        <button class="btn btn-default" type="button" id="sorting_by_sgs">SGS</button>
        <button class="btn btn-default" type="button" id="sorting_by_codengo">Codengo </button>
      </div>
    </div>
    <div id="navRight-middle">
      <div class="exams-loader hide"><i class="icon-spinner icon-spin icon-large"></i> Chargement...</div>
      <div id="listResultsExams">
        <%= render partial: 'exam_centers/exam_center', collection: @exam_centers %>
      </div>
    </div>
  </div>

</div>

<script id="ExamCenterListTpl" type="text/template">

  {{#features}}

  <div class="entry-line-small" data-position="{{geometry.coordinates}}" data-distance-from-center="{{properties.distance_from_center}}" data-marker="{{properties.title}}" data-name="{{properties.title}}"  data-is-la-poste="{{properties.is_la_poste}}" data-is-sgs="{{properties.is_sgs}}" data-is-codengo="{{properties.is_codengo}}">
    <div class="row">
      <div class="entry-line-small-text tiny col-md-8 col-sm-8">
        <div class="entry-line-small-title">
          <h6 class="title"><a class="exam-centers-listing-title" href="#" data-position="{{geometry.coordinates}}" data-marker="{{properties.title}}">{{properties.title}}</a></h6>
          <div class="listing-address">
            {{properties.adress}} {{properties.zipcode}}  {{properties.city}} {{properties.type}}
          </div>
        </div>
      </div>
    </div>
  </div>
  {{/features}}

</script>

<script id="ExamCenterPopupTpl" type="text/template">
  <strong><a id="exam-center-title-popup-link" href="#">{{ title }}</a></strong>
  <br />
  <div class="listing-address" style="line-height: 11px">
    {{ adress }} {{ zipcode }} {{ city }} {{ type }}
  </div>
</script>


    <%= javascript_include_tag "mapbox.js" %>

{{properties.address}{{properties.zipcode}{{properties.city}{{properties.type}
{{/features}


{{address}{{zipcode}{{city}{{type}}

有人知道这是什么错误吗?

要使用
geoNear
您的收藏中需要一个地理空间索引

检查您的模型中是否有良好的
索引,如中所示:

您还应该运行rake任务
bin/rake db:mongoid:create_index
来创建索引。
您也可以在rails控制台内尝试Mongo查询。

要使用
geoNear
您的集合中需要一个地理空间索引

检查您的模型中是否有良好的
索引,如中所示:

您还应该运行rake任务
bin/rake db:mongoid:create_index
来创建索引。 您也可以在rails控制台中尝试Mongo查询