Rails 4: Геокодер с Devise

Когато текущият потребител създаде публикация, иска да знае местоположението на потребителя чрез метода за обръщане на IP в Geo-coder. За това създадох модел на публикация, потребител и местоположение. Преминах през railscasts и се научих да инсталирам Geocoder и мога да намеря географска ширина, дължина чрез адрес. Сега как да интегрирате потребителски идентификатор от устройство към геокодер, за да определите текущото потребителско местоположение.

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

Актуализирано:

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


person akhil ranjith    schedule 06.05.2015    source източник
comment
можете да използвате Geocoder.search(1 Twins Way, Minneapolis).... Geocoder.search(44.981667,-93.27833).... Geocoder.search(204.57.220.1).....   -  person Milind    schedule 06.05.2015
comment
@Milind някакъв начин за прикачване на Geocoder към потребителски идентификатор ??   -  person akhil ranjith    schedule 06.05.2015
comment
Какво искате да направите....ако наистина искате да прикачите user_id, тогава бихте могли да добавите адресна колона към таблицата с потребители...по този начин всеки потребител ще има свои собствени подробности. Но към момента...не можете прикачете подробности за геокод към user_id, без да правите промени в изпълнението на модела....   -  person Milind    schedule 06.05.2015
comment
Тук също не виждам нищо за публикациите в блога. Очаквам, че ще имате модел на Pots с колона user_id и колона за местоположение за информацията от Geocoder.   -  person ekampp    schedule 06.05.2015
comment
@EmilKampp актуализирах схемата, за да покажа и трите модела.   -  person akhil ranjith    schedule 07.05.2015
comment
@Milind Добавих колона за местоположение (адрес) към потребителската таблица, но има ли начин да получа местоположението на потребителя, без да ги моля да въведат своето местоположение.   -  person akhil ranjith    schedule 07.05.2015
comment
@akhilranjith...наистина не разбирам..ако имате адрес в таблицата с потребители..тогава какъв е проблемът..нуждаете се поне от ключ за заявка с таблицата, за да получите адреса....   -  person Milind    schedule 08.05.2015
comment
@Milind добре, можеш ли да ми кажеш как да получа ip на текущия потребител и да го конвертирам в адрес   -  person akhil ranjith    schedule 08.05.2015
comment
@akhilranjith.. добавих отговор .... надявам се, че може да помогне за това, което търсите... :)   -  person Milind    schedule 08.05.2015
comment
@Milind Благодаря ви за повторението ... ще го пробвам !!   -  person akhil ranjith    schedule 08.05.2015


Отговори (1)


Въз основа на дискусията, ако искате да получите потребителите ip и след това да го използвате, за да получите address... можете да използвате кода по-долу в user.rb с ip, който вече присъства в users таблица.

Devise съхранява автоматично текущия и последния IP адрес на потребителя в потребителската таблица. Имената на колоните, които използва, са „current_sign_in_ip“, „last_sign_in_ip“.

При даден потребителски модел с известен IP адрес, автоматично извличане на координати и съхраняване в атрибутите за географска ширина и дължина:

# app/models/user.rb
geocoded_by :current_sign_in_ip,
  :latitude => :lat, :longitude => :lon
after_validation :geocode
person Milind    schedule 08.05.2015
comment
Аз съм нов в релсите, създадох само потребителски модел и изгледи, без контролери, когато проверих Конфигуриране на контролери в devise github ... трябва ли да направя това или нещо друго .. можете ли да ми помогнете със стъпки от инструкции как да го направя..... Прочетох също Методът за местоположение е уязвим към тривиално подправяне на IP адреси чрез HTTP заглавки. .Така че използването на geocoderv безопасно ли е да получите ip от текущия потребител, за да намерите местоположението му??? - person akhil ranjith; 08.05.2015
comment
Първо внедрите поведението по подразбиране на devise, като регистрирате потребителя с помощта на сесиен контролер или първо регистрирате потребителя и след това проверите своя db запис. Ще получите текущия ip, който можете да използвате допълнително. Опитайте го. Или ми кажете в кой момент вие сте заседнали. - person Milind; 09.05.2015