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.