2011-06-07 154 views
1

我正在使用gem'geocoder'。 我想做一个对象,将获取从IP地址的经度和纬度。关于geocoder gem的问题

这是我的对象模型的样子:如果我改变了方法,IP到

NoMethodError (undefined method `request'for #<Hey:0x7f268f47dd00>): 

def ip 
    return "24.193.83.1" 
    end 

class Hey < ActiveRecord::Base 

    geocoded_by :ip 
    after_validation :geocode 

    def ip 
    return request.ip 
    end 

end 

当我创建一个对象,我得到这个错误

它的工作原理。为什么request.ip在模型中不起作用? request.ip适用于我的控制器。

我该如何解决这个问题?

感谢,

俄德

回答

2

这就是我解决它的方法。

模型:

class Hey < ActiveRecord::Base 

     attr_accessor :ip_address 

     geocoded_by :ip_address 
     after_validation :geocode 

    end 

控制器:

class HeysController < ApplicationController 

def create 
     hey = Hey.new 
     hey.ip_address = request.ip 
     hey.save 

     redirect_to :action => "index" 
     end 

end 
2

您还需要存储这个对象的IP。创建新对象时,用request.ip填充ip_address。比模型中的代码看起来像:

geocoded_by :ip_address, 
    :latitude => :lat, :longitude => :lon #this is also fields in the db 
after_validation :geocode 

或类似的东西。

+0

你说的 '存储IP' 是什么意思?我应该在数据库中创建一个名为'ip_address'的属性吗? – 2011-06-07 16:53:27

+0

是的,我的意思是,地理编码器需要从数据库获取ip或类似的东西。对不起我的英语:]返回“some_ip”的作品,因为它返回一个适合地理编码器的字符串。你不能从模型中调用request.ip方法。请求模型层无法访问。所以你需要在某处保存用户ip。 – 2011-06-07 20:12:02

+0

感谢您的帮助!我以不同的方式解决了它(使用attr_accesor)。 – 2011-06-07 20:18:21