Rails geocoder - геокодиране за регистрирани и гост потребители

Имам приложение, което използва rails geocoder, за да намери местоположения на регистрирани потребители по техния предоставен пощенски код. Това работи добре за регистрирани потребители, но също така искам да разширя някои функции за гост потребители. Използвам решението на 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 и след това да предам стойностите на lat и long, когато бъде създаден потребителят гост? Всяка помощ е много ценена, благодаря предварително!


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
опа натисна enter. def nonguest / self.name != 'guest' / край - person ussferox; 22.11.2013