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 %>
current_user, can you not do this -current_user.nearbys(500). Also check this on rails console to see if your getting some results. I mean test it on the console and once its understood that the results are fine, display in you views. - Pramod Solanky