Rails geocoder - геокодирование для зарегистрированных и гостевых пользователей

У меня есть приложение, которое использует геокодер rails для поиска местоположения зарегистрированных пользователей по предоставленному ими почтовому индексу. Это хорошо работает для зарегистрированных пользователей, но я также хочу расширить некоторые функции для гостевых пользователей. Я использую решение Devise для гостевых пользователей, как показано в этой ссылке: https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user

Вот моя пользовательская модель:

class User < ActiveRecord::Base

devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

validates :zip, presence: true
geocoded_by :zip
after_validation :geocode

end

Вот мой метод create_guest_user:

def create_guest_user
    u = User.create(:name => "guest", :email => "guest_#{Time.now.to_i}#{rand(99)}@example.com")
    u.save!(:validate => false)
    session[:guest_user_id] = u.id
    u
end

Я хочу геокодировать местоположение guest_user по их IP. Есть ли способ вызвать метод геокодирования в моем методе create_guest_user, а затем передать значения широты и долготы при создании гостевого пользователя? Любая помощь приветствуется, заранее спасибо!


person settheline    schedule 14.11.2013    source источник


Ответы (1)


Вы пытались передать условие в geocoded_by? Я просмотрел документы в поисках примера и не смог найти его, но, по крайней мере, стоит попробовать.

class User
  geocoded_by :ip_address, :if => :name == "guest"
end

Если это не сработает, вы можете определить новый метод геокодирования (как в примере, приведенном для адреса здесь):

class User
  validates_presence_of :zip, :if => non_guest #(or however you define a real user)
  geocoded_by :zip_or_ip
  after_validation :geocode

  def zip_or_ip
    if name == 'guest'
      :ip_address
    else
      :zip
    end
  end
end

а затем избавьтесь от :validate => false в вашем контроллере (или сохраните его, если вам нужно для других целей).

person ussferox    schedule 21.11.2013
comment
Это сработало, спасибо! Я пошел дальше и использовал созданный метод, подобный вашему второму предложению. Я не мог найти чистый способ определить реального пользователя в строке validate_presence_of. Какие-либо предложения? - person settheline; 22.11.2013
comment
Прохладный! Ну, я действительно не знаю, что вы делаете с пользователями, но я думаю, что самым простым способом будет «if: :nonguest» и «def non guest». - person ussferox; 22.11.2013
comment
упс нажал энтер. def nonguest / self.name != 'гость' / конец - person ussferox; 22.11.2013