Я создал приложение, которое создает модель пользователя и автоматически создает модель профиля и модель местоположения (называемую жилой), используя метод обратного вызова 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, которая принадлежит жизни, но в тот момент я понятия не имел, как я мог когда-либо получить доступ к записи, сохраненной для адреса в таблице живых моделей.
Пожалуйста, некоторые предложения?
Спасибо, Динуз.
gmaps4rails
безуспешно пытается выполнить геокодирование. Вы пытались сделать: ` def prevent_geocoding; новая запись? || текущий_адрес.пусто? || (!latitude.blank? && !longitude.blank?); конец` - person apneadiving   schedule 09.03.2012