Rails 3: проблема After_create с act_as_gmappable

Я создал приложение, которое создает модель пользователя и автоматически создает модель профиля и модель местоположения (называемую жилой), используя метод обратного вызова after_create в модели. Профиль модели принадлежит пользователям, и пользователи имеют один профиль, а местоположение модели принадлежит профилю, а профиль имеет одно местоположение.

Модель называется location, используйте геокодер gem с адресом current_ip клиентской машины, чтобы вывести текущее местоположение пользователя, а затем сохраните адрес, широту и долготу в той же модели.

Все работает идеально и прекрасно, за исключением того, что когда я пытаюсь добавить в модель местоположения, act_as_gmappable, то в процессе регистрации эта же модель больше не создается автоматически, и это предотвращает создание адреса столбца базы данных и, очевидно, это приведет к ошибке gmapsforails.

Как я могу использовать обратный вызов after_create в модели профиля, а затем автоматически создать модель местоположения и ее столбец (долгота, широта, адрес, ip_address) и в то же время использовать после act_as_gmappable?

Я думаю, это проблема, связанная с тем, какой метод вызывается раньше: after_create или gmapsforrails... это потому, что, если я вырезаю из своей модели местоположения вызов act_as_gmappable, регистрирую пользователя и после того, как возвращаюсь обратно в модель местоположения, act_as_gmappable, все работает нормально, и карта гугла показывается.

Спасибо всем, кто хоть как-то смог осветить мой разум...

(1) ПРОФИЛЬНАЯ МОДЕЛЬ

class Profile < ActiveRecord::Base

  # Setup model relationships (has_many require plural)
  belongs_to :user
  has_one :living

  after_create :create_living

  accepts_nested_attributes_for :living

  # Setup accessible (or protected) attributes for your model
  attr_accessible :registration_ip, :registration_timezone, :registration_address, :registration_address_components, :latitude, :longitude, :living_attributes

  # Setup Geocoder routine
  geocoded_by :registration_ip
  after_validation :geocode

  reverse_geocoded_by :latitude, :longitude do |obj,results|
    if geo = results.first
      obj.registration_address_components  = ActiveSupport::JSON.encode(geo.address_components)
      obj.registration_address  = geo.address
    end
  end

  after_validation :reverse_geocode

end

(2) ЖИВАЯ МОДЕЛЬ

class Living < ActiveRecord::Base

  # Setup model relationships
  belongs_to :profile

  # Setup accessible (or protected) attributes for your model
  attr_accessible :current_ip, :current_timezone, :current_address, :current_address_components,     :latitude, :longitude, :gmaps

  geocoded_by :current_ip
  after_validation :geocode, :if => :current_ip_changed?

  reverse_geocoded_by :latitude, :longitude do |obj,results|
    if geo = results.first
      obj.current_address_components  = ActiveSupport::JSON.encode(geo.address_components)
      obj.current_address  = geo.address
    end
  end

  after_validation :reverse_geocode, :if => :current_ip_changed?


  acts_as_gmappable :lat => 'glat', :lng => 'glng', :check_process => :prevent_geocoding,
                    :address => "current_address", :normalized_address => "current_address",
                    :msg => "Sorry, not even Google could figure out where that is"

  def prevent_geocoding
    current_address.blank? || (!latitude.blank? && !longitude.blank?)
  end
end

ПРИМЕЧАНИЕ. create_before для профиля находится в пользовательской модели. В этой системе каждый раз, когда пользователь регистрируется, приложение автоматически создает запись пользователя в таблице пользователей, запись профиля в таблице профилей и живую запись в живой записи. Все работает идеально гладко, за исключением случаев, когда я добавляю act_as_gmappable в живую модель. В этот момент запись в таблице живой модели больше не создается автоматически, и, очевидно, карты Google не будут работать, потому что не найдут адрес в таблице живой модели (живая модель будет нулевой).

Я подумал, что, возможно, из-за метода before_create, используемого в модели, чтобы добавить карту к жизни, мне нужно будет создать другую модель, скажем, gmapliving, которая принадлежит жизни, но в тот момент я понятия не имел, как я мог когда-либо получить доступ к записи, сохраненной для адреса в таблице живых моделей.

Пожалуйста, некоторые предложения?

Спасибо, Динуз.


person Dinuz    schedule 08.03.2012    source источник
comment
Это немного запутанно читать, я думаю, что вся информация не нужна. Я предполагаю, что gmaps4rails безуспешно пытается выполнить геокодирование. Вы пытались сделать: ` def prevent_geocoding; новая запись? || текущий_адрес.пусто? || (!latitude.blank? && !longitude.blank?); конец`   -  person apneadiving    schedule 09.03.2012
comment
зачем вам gmaps4rails для геокодирования, если вы используете геокодер?   -  person apneadiving    schedule 09.03.2012
comment
Я хочу карту... вот и все! Я хотел бы показать место регистрации и текущее местоположение на той же карте. Я не хочу использовать gmaps4rails для геокодирования, вместо этого я хотел бы использовать карты, которые он позволяет мне показывать.   -  person Dinuz    schedule 12.03.2012
comment
Я бы хотел не просить gmaps4rails выполнить геокодирование, а вместо этого просто использовать результаты геокодирования, поступающие от геокодера. Таким образом, я могу получить доступ к картам, используя gmaps4rails. Примечание. У меня уже есть широта и долгота, использующие геокодер, я хочу использовать его после того, как этот геокодер завершит свою собственную задачу (таким образом, мне не потребуется gmaps4rails для повторного геокодирования), и я смогу получить доступ к встроенной функции карт. с gmaps4rails.   -  person Dinuz    schedule 12.03.2012


Ответы (1)


Поскольку вам не нужно геокодирование от gmaps4rails, добавьте эту опцию:

:process_geocoding => false

Здесь все объясняется: https://github.com/apneadiving/Google-Maps-for-Rails/wiki/Model-Customization

person apneadiving    schedule 12.03.2012
comment
Боже!!! Это работает отлично ... большое спасибо! Очевидно, что раньше gmaps4rails тоже пытался геокодировать, и это был конфликт генерации... Я такой придурок!! - person Dinuz; 13.03.2012