Я создал приложение, которое создает пользовательскую модель и автоматически создает модель профиля и модель местоположения (называемую жилой), используя метод обратного вызова 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