Ошибка с геокодом, рельсами и монгоидом

Я использую Rails 3.2.16, монгоид и геокод.

Я настроил модель для своего профиля, чтобы преобразовать адрес улицы и города в долготу/широту. Это работает хорошо. У меня также есть поиск, основанный на геокоде, который тоже работает. Он ищет профили с определенными расстояниями и т. д.

Даже когда я ошибаюсь в названии города в поиске, он достаточно умен, чтобы понять, что я на самом деле имею в виду.

Однако, когда я ищу что-то, что действительно ставит геокод в тупик, например "sgervwsewerw", выдает ошибку "Извините, но что-то пошло не так". Как я могу предотвратить эту ошибку и просто не возвращать результаты? Вот информация об ошибке:

Processing by ProfilesController#index as HTML
  Parameters: {"utf8"=>"✓", "profile_search"=>"sgervwsewerw"}
  Rendered profiles/index.html.erb within layouts/application (137.3ms)
Completed 500 Internal Server Error in 489.6ms

ActionView::Template::Error (The operation: #<Moped::Protocol::Query
  @length=208
  @request_id=2
  @response_to=0
  @op_code=2004
  @flags=[]
  @full_collection_name="tango_production.profiles"
  @skip=0
  @limit=0
  @selector={"$query"=>{"coordinates"=>{"$nearSphere"=>[NaN, NaN], "$maxDistance"=>0.0063151153689165445}}
  @fields=nil>
failed with error 16433: "point not in interval of [ -180, 180 ] :: caused by :: { 0: nan.0, 1: nan.0 }"

See https://github.com/mongodb/mongo/blob/master/docs/errors.md
for details about this error.):

Вот код из моего контроллера профиля:

def index
 if params[:profile_search].present?
    @profiles = Profile.near(params[:profile_search], 25, :order => :distance).desc("position_order")
  else
    @profiles = Profile.desc("position_order")
  end
end

person say    schedule 21.02.2014    source источник


Ответы (2)


Ваша проблема, кажется, в аргументе NaN в $nearSphere для координат. Убедитесь, что вы указали правильные значения для сравнения (например, если вы используете местоположение пользователя, убедитесь, что оно доступно).

Надеюсь, это поможет.

person Michael Johann    schedule 25.02.2014

В вашем файле инициализатора mongoid.yml вы найдете строку вроде:

# Raise an error when performing a #find and the document is not found.
# (default: true)
raise_not_found_error: false

по умолчанию это правда, если вы установите значение false, вы больше не получите эту ошибку.

person Tim    schedule 24.02.2014
comment
Я все еще получаю сообщение об ошибке после этого, к сожалению. - person say; 25.02.2014
comment
Преобразование слишком долго/широта, кажется, возвращает NaN. Вы можете проверить, является ли широта/долгота пустым или нет, прежде чем отправлять его в монгоид. - person Tim; 25.02.2014
comment
То, что вы сказали, имеет смысл. Однако, попробовав пару вещей (на самом деле догадываясь), я не мог понять, как это сделать. Любые советы о том, что я могу сделать? Я в основном смотрю, возвращается ли действительный результат. - person say; 27.02.2014
comment
вы можете сначала взять params[:profile_search] и получить его широту\долготу, используя, например: Geocoder.coordinates("25 Main St, Cooperstown, NY") Вы получаете массив широты и долготы, который вы можете использовать. Если это возвращает nil, вы не должны запрашивать db. - person Tim; 28.02.2014