我有一个使用rails geocoder的应用程序,通过提供的邮政编码查找注册用户的位置。这适用于注册用户,但我还想将一些功能扩展到访客用户。我正在为访客用户使用设计解决方案,如以下链接所示:https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user
这是我的用户模型:
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
我想通过IP来对guest_user的位置进行地理编码。有没有办法可以在我的create_guest_user
方法中调用地理编码方法,然后在创建访客用户时传递lat和long的值?非常感谢任何帮助,提前感谢!
答案 0 :(得分: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
然后摆脱:validate =&gt;在你的控制器中是假的(如果你需要其他的东西,请保留它)。