如何使用地理编码器gem成功执行距离查询?

时间:2015-01-09 07:08:05

标签: ruby-on-rails rails-geocoder

我试图利用地理编码器宝石,以便登录的用户可以查看位于5英里范围内的其他用户的列表,但似乎无法获得宝石显示结果。正如宝石手册中所示,我的表中有经度和纬度列,并且我的所有测试用户都有这些属性,并且距离彼此相差5英里,所以这应该有效。但是,我的视图页面(_network.html.erb)目前没有显示任何结果。我是编码的新手,非常感谢他们的帮助。下面的代码,任何人都可以告诉我我做错了什么,以及如何解决?

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 %>

1 个答案:

答案 0 :(得分:0)

只是想出来。我在模型中添加了以下方法:

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

并相应地更改了我的控制器

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