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

Когда текущий пользователь создает сообщение, он хочет узнать местоположение пользователя с помощью обратного метода IP в Geo-coder. Для этого я создал модель сообщения, пользователя и местоположения. Я прошел через railscasts и научился устанавливать геокодер и находить широту и долготу по адресу. Теперь, как интегрировать идентификатор пользователя из устройства в геокодер, чтобы определить текущее местоположение пользователя.

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, Миннеаполис).... Geocoder.search(44.981667,-93.27833).... Geocoder.search(204.57.220.1).....   -  person Milind    schedule 06.05.2015
comment
@Milind есть ли способ привязать геокодер к идентификатору пользователя ??   -  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
Я новичок в рельсах, я создал только пользовательскую модель и представления, без контроллеров, когда я проверил Настройка контроллеров в разработке github ... должен ли я сделать это или что-то еще ... можете ли вы помочь мне с шагами инструкции, как чтобы сделать это ..... Я также прочитал Метод определения местоположения уязвим для тривиальной подделки IP-адреса через заголовки HTTP. .Так что, используя geocoderv, безопасно ли получить IP от текущего пользователя, чтобы найти его местоположение??? - person akhil ranjith; 08.05.2015
comment
Прежде всего, реализуйте поведение devise по умолчанию, зарегистрировав пользователя с помощью контроллера сеансов или сначала зарегистрировав пользователя, а затем подтвердив свою запись в базе данных. Вы получите текущий IP-хик, который вы можете использовать дальше. вы застряли. - person Milind; 09.05.2015