Геокодер: метод .nearbys выдает ActionView::Template::Error (неопределенный метод `each' для nil:NilClass):

Я пытаюсь реализовать геокодер в своем приложении. Я хотел бы показать Ближайшие места на странице каждого места. Я продолжаю получать эту ошибку:

ActionView::Template::Error (undefined method `each' for nil:NilClass):
    38:            
    39:               %h4 Nearby places
    40:               - @place.nearbys.each do |place|
    41:                 %li
    42:                   = link_to place.name, place
    43:                   (#{place.distance.round(2)} kilometers)

app/views/places/show.html.haml:40:in `_app_views_places_show_html_haml__1604860997730316275_70230188982160'

Я думаю, это связано с тем, что некоторые места геокодируются, а другие нет. Например, для этого адреса, который у меня есть, в консоли значения широты и долготы выводят nil, а метод .geocode на нем не работает. Однако для других адресов значения широты и долготы генерируются автоматически (как и ожидалось). Вот код, который у меня есть: место Модель:

class Place < ApplicationRecord
  geocoded_by :full_address
  after_validation :geocode, if: :address_changed?

  def full_address
    [address1, address2, city, region].compact.join(", ")
  end

  def address_changed?
    address1_changed? || address2_changed? || city_changed? || region_changed?
  end


end

Контроллер мест:

def show
  @place = Place.find(params[:id])
end


def create
    @place = Place.new(place_params)
    respond_to do |format|
      if @place.save
        format.html { redirect_to @place, notice: 'Place was successfully created.' }
        format.json { render :show, status: :created, location: @place }
      else
        format.html { render :new }
        format.json { render json: @place.errors, status: :unprocessable_entity }
      end
    end
  end

Места показывают вид:

          %p= @place.address1
          %p= @place.address2
          %p= @place.city
          %p= @place.region
          %p= @place.phone
          %p= @place.email

          #mapid
           %h4 Nearby places
           - @place.nearbys.each do |place|
             %li
              = link_to place.name, place
              (#{place.distance.round(2)} kilometers)



def place_params
      params.require(:place).permit(:name, :description, :address1, :address2, :city, :region, :phone, :email)
    end

В результате я могу создавать новые места только с одними адресами, а с другими могу. Как предотвратить эту ошибку? Я подумал, может быть, есть метод, который проверяет, были ли сгенерированы широта и долгота местоположения. Если нет, то сгенерируйте их перед сохранением. Как реализовать эти условия?


person Christian Dziwornu    schedule 06.12.2018    source источник


Ответы (1)


вы можете сделать простую проверку там, что-то вроде

if @place.nearbys.present?
  - @place.nearbys.each do |place|
    %li
      = link_to place.name, place
      (#{place.distance.round(2)} kilometers)
   ...
person xploshioOn    schedule 06.12.2018
comment
Спасибо. Оба решения работают. Однако есть ли способ принудительно геокодировать местоположения с нулевыми значениями долготы и широты? Я могу найти эти местоположения на картах Google, но геокодер не может их геокодировать (или автоматически назначать значения широты/долготы). - person Christian Dziwornu; 06.12.2018
comment
Я бы предложил создать, возможно, задачу rake для обновления широты и долготы по адресу, чтобы у вас были все места с этими - person xploshioOn; 06.12.2018