简体   繁体   中英

How can I successfully perform distance queries with geocoder gem?

I'm trying to make use of the geocoder gem such that a user who is signed in, can view a list of other users that are located within 5 miles, but can't seem to get the gem to display the results. As indicated in the gem manual, I've got longitude and latitude columns in my table, and all of my test users have those attributes present, and are well within 5 miles of each other, so this should be working. However, my view page (_network.html.erb) is currently displaying no results. I'm new to coding and would really appreciate the help. Code below, can anyone tell my what I'm doing wrong, and how to go about fixing?

users_controller

class UsersController < ApplicationController
  before_filter :authenticate_user!
  helper_method :sort_column, :sort_direction

    def index
      @users = User.near([current_user.longitude, current_user.latitude], 500).order(sort_column + " " + sort_direction).paginate(:per_page => 5, :page => params[:page])
    end

    def show
      @user = User.find(params[:id])
    end

    def new
    end

    def create
    end

    def edit
    end

    def update
      @user = User.find(params[:id])
      if @user.update(user_params)
        flash[:success] = "Your profile has been updated!"
        redirect_to @user
      else
        flash[:error] = "Please try again"
        redirect_to edit_profile_user_path(@user)
      end
    end

    def destroy
    end

    def edit_profile
      @user = User.find(params[:id])
    end

    def user_params
      params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :current_industry, :years_in_current_industry, :hobbies, :previous_industries, :bio, :ip_address, :latitude, :longitude, :linkedin)
    end

    def sender
      @user = User.find(params[:id])
    end

    def recipient
      @user = User.find(params[:id])
    end

    def geolocate
      @user = User.find(params[:id])
      if @user.updated_at < 1.day.ago || params[:force] == 'true'
        if @user.update_attributes(latitude: params[:latitude].to_f, longitude: params[:longitude].to_f)
          render nothing: true, status: 200
        else
          render nothing: true, status: 500
        end
      else
        render nothing: true, status: 304
      end
    end

    private

    def sort_column
      User.column_names.include?(params[:sort]) ? params[:sort] : "years_in_current_industry"
    end

    def sort_direction
      %w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
    end

    def geolocate_user
      location = request.location
      @user.update_attributes(latitude: location.latitude, longitude: location.longitude)
      redirect_to :controller=>'users', :action => 'index'
    end

end

User.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :first_name, :last_name, :email, :password, :password_confirmation, :remember_me, :current_industry, :years_in_current_industry, :hobbies, :bio, :ip_address, :latitude, :longitude, :previous_industries, :linkedin
  reverse_geocoded_by :latitude, :longitude

  def full_name
    [first_name, last_name].join(" ")
  end

end

index.html.erb

<div id='user_id' data-user=<%= current_user.id %>></div>
<h1>Network</h1>

<%= submit_tag 'GEOLOCATE ME', :type => 'button', class: 'geo-button' %>

<div class ="network">
  <div class="network-body">

    <div id="network"><%= render 'network' %></div>

  </div>
</div>

<br>

_network.html.erb

<table class="table">
  <thead>
    <tr>
      <th>Name</th>
      <th><%= sortable "current_industry", "Current Industry" %></th>
      <th><%= sortable "years_in_current_industry", "Years" %></th>
    </tr>
  </thead>
  <tbody>
    <% @users.each do |user| %>
    <tr>
      <td><%= link_to user.full_name, user_path(user.id) %></td>
      <td><%= user.current_industry %></td>
      <td><%= User::EXPERIENCE[user.years_in_current_industry] %></td>
    </tr>
    <% end %>
  </tbody>
</table>

<%= will_paginate @users %>

Just figures it out. I added the following method to my model:

def geocentric
  User.near([latitude, longitude], 10)
end

and changed my controller accordingly

def index
  @users = current_user.geocentric.order(sort_column + " " + sort_direction).paginate(:per_page => 5, :page => params[:page])
end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM