2013-11-14 1 views
0

У меня есть приложение, которое использует рельсовый геокодер, чтобы найти местоположения зарегистрированных пользователей по их предоставленному почтовому индексу. Это хорошо работает для зарегистрированных пользователей, но я также хочу расширить функциональность для гостевых пользователей. Я использую решение разработать для пользователей, гостей, как показано в этой ссылке: https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-userRails geocoder - геокодирование для зарегистрированных и гостевых пользователей

Вот моя модель пользователя:

class User < ActiveRecord::Base 

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

validates :zip, presence: true 
geocoded_by :zip 
after_validation :geocode 

end 

Вот мой create_guest_user метода:

def create_guest_user 
    u = User.create(:name => "guest", :email => "guest_#{Time.now.to_i}#{rand(99)}@example.com") 
    u.save!(:validate => false) 
    session[:guest_user_id] = u.id 
    u 
end 

Я хочу геокодирую guest_user-х местоположение по их IP. Есть ли способ, который я могу вызвать метод геокодирования в моем методе create_guest_user, а затем передать значения lat и long, когда пользователь гостя будет создан? Любая помощь очень ценится, спасибо заранее!

ответ

1

Вы пытались передать условие geocoded_by? Я просмотрел документы для примера и не смог найти его, но, по крайней мере, стоит попробовать.

class User 
    geocoded_by :ip_address, :if => :name == "guest" 
end 

Если это не работает, вы можете определить новый метод для геокодирования по (как в приведенном примере для адреса 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 

, а затем избавиться от: проверить = > false в вашем контроллере (или сохранить его, если вам нужно для других вещей).

+0

Это сработало, спасибо! Я пошел вперед и использовал метод, подобный вашему второму предложению. Я не мог понять, как определить реального пользователя в строке 'validate_presence_of'. Какие-либо предложения? – settheline

+0

Прохладный! Ну, я не знаю, что вы делаете с пользователями, но я думаю, что самым простым способом было бы «if:: nonguest» и «def non guest – ussferox

+1

whoops нажал enter. def nonguest/self.name! = 'guest'/end – ussferox

 Смежные вопросы

  • Нет связанных вопросов^_^