Have you tried passing a condition to geocoded_by? I browsed through the docs for an example and couldn't find one, but it's worth a try at least.
class User
geocoded_by :ip_address, :if => :name == "guest"
end
If that doesn't work, you can define a new method to geocode by (like in the example given for address here):
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
and then get rid of the :validate => false in your controller (or keep it if you need to for other things).