Rails 3: проблема After_create с acts_as_gmappable - PullRequest
0 голосов
/ 08 марта 2012

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

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

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

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

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

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

(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, которая принадлежит жизни, но в этот момент у меня нет Идея, как я могу получить доступ к записи, сохраненной для адреса в таблице живой модели.

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

Спасибо Dinuz

1 Ответ

3 голосов
/ 12 марта 2012

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

:process_geocoding => false

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

...