Rails地理编码器 - 为注册用户和访客用户进行地理编码

时间:2013-11-14 21:12:43

标签: ruby-on-rails google-maps-api-3 devise rails-geocoder

我有一个使用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的值?非常感谢任何帮助,提前感谢!

1 个答案:

答案 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;在你的控制器中是假的(如果你需要其他的东西,请保留它)。