0
votes

When current user creates a post want to know user location via IP reverse method in Geo-coder.For that i have created a post ,user and location model. I have gone through railscasts and have learn to installed Geocoder and able to find latitude, longitude via address. Now how to integrate user id from devise to geocoder to determine current user location.

class Location < ActiveRecord::Base
	belongs_to :user
	geocoded_by :address
	after_validation :geocode, :if => :address_changed?
end


class LocationsController < ApplicationController
  before_action :set_location, only: [:show, :edit, :update, :destroy]

  respond_to :html

  def index
    #location = request.location
    @locations = Location.all
    respond_with(@locations)
  end

  def show
    respond_with(@location)
  end

  def new
    @location = Location.new
    respond_with(@location)
  end

  def edit
  end

  def create
    if params[:location].blank?
      @location = request.location
      @locations = Location.near([current_user.latitude, current_user.longitude], 50, :order => :distance)
    end
    respond_with(@location)
  end

Updated:

ActiveRecord::Schema.define(version: 20150507160846) do

  create_table "locations", force: true do |t|
    t.string   "address"
    t.float    "latitude"
    t.float    "longitude"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "user_id"
    t.string   "integer"
  end

  create_table "posts", force: true do |t|
    t.text     "post"
    t.string   "location"
    t.string   "tag_list"
    t.boolean  "active"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "user_id"
  end

  create_table "users", force: true do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "name"
    t.string   "location"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true

end



class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :posts
  has_many :locations
end
1
you can use Geocoder.search("1 Twins Way, Minneapolis").... Geocoder.search("44.981667,-93.27833").... Geocoder.search("204.57.220.1")..... - Milind
@Milind any way to attach Geocoder to user id ?? - akhil ranjith
What do you want to do....if you really want to attach user_id ,then you could have added address column to user table ...in this way every user would have its own details.But as of now..you cannot attach geocode details to user_id without making changes in model implementation.... - Milind
I don't see anything in here about the blog posts either. I would expect that you would have a Pots model with a user_id column and a location column for the information from Geocoder. - ekampp
@EmilKampp i have updated Schema to show all the three models. - akhil ranjith

1 Answers

2
votes

Based on the discussion ,if You want to get the users ip and then use it to get the address...you can use the below code in user.rb with ip already present in users table.

Devise stores the current and last ip address of the user automagically in user table. The column names it uses are "current_sign_in_ip", "last_sign_in_ip".

Given a User model with known IP address, automatically fetch coordinates and store in latitude and longitude attributes:

# app/models/user.rb
geocoded_by :current_sign_in_ip,
  :latitude => :lat, :longitude => :lon
after_validation :geocode