2013-10-02 2 views
1

나는 제안 (Offers) 모델을 가지고 있으며 사용자로부터 IP 주소를 얻고 위도와 경도로 좌표를 지오 코딩하려고합니다. 보석 설명서는 IP 주소가 알려진 경우 코드가되어야 함을 나타냅니다 :Ruby Geocoder gem in Rails에서의 문제

모델 : 나는 IP 주소가없는 그러나

 geocoded_by :ip_address, :latitude => :latitude, :longitude => :longitude 

처음에 저장 그래서이 그것을 변경 :

if :current_location 
self.ip_address = request.ip 
      geocoded_by :ip_address, :latitude => :latitude, :longitude => :longitude 
end 

request.ip은 ActionView에서 가져온 메소드이므로 Model에서 호출 할 수는 없다고 생각합니다. 필자는 이것을 도우미 메서드로 테스트했으며 로컬 : 호스트 주소를 반환합니다. 그러나이 형식으로 저장하려고하면 모델에 아무 것도 저장하지 않습니다.

ip_address를 모델에 저장하여이 형식으로 사용할 수있는 가장 좋은 방법은 무엇입니까? 도우미 메서드로 추출해야합니까? 모델에 맞는 모듈이 include 또는 require일까요?

는 참고로 보석 가이드는 여기에 있습니다 : http://www.rubygeocoder.com

감사 모든 도움이, 감사합니다.

답변

1

모델에서 geocoded_by 메소드를 사용하는 대신 직접 Geocoder 클래스를 사용할 수 있습니다. 오퍼 생성을 처리하는 서비스 객체를 생성합니다.

Geocoder.coordinates(ip_address) # => [latitude, longitude] 

나는 다음과 같은 것을 할 것입니다 : 당신은 다음을 수행하여 IP_ADDRESS의 좌표를 찾을 수 있습니다에서

class OfferGeocoder 
    attr_reader :request, :params, :coordinates 

    def initialize options = {} 
    @request = options[:request] 
    @params = options[:params] 
    end 

    def coordinates 
    @coordinates ||= Geocoder.coordinates(request.remote_ip) 
    end 

    def create_offer 
    Offer.new(params.merge({ 
     latitude: coordinates.first, 
     longitude: coordinates.last 
    }) 
    end 
end 

당신이 호출 할 수있는 컨트롤러의 동작 생성 :

def create 
    @offer = OfferGeocoder.new(params: offer_params, request: request).create_offer 
    if @offer.save 
    ... 
end 
+0

고맙지 만 지금은 지오 코딩 기능 외에도 조금 복잡해 졌으므로이 단계에서 모델을 다시 작성하기를 꺼립니다. 사용자의 IP 주소를 얻고 사용했던 모델에 저장하는 다른 방법이나 쉬운 방법이 있습니까? Geokit 레일을 사용해보고 더 잘 작동하는지 살펴 보겠습니다. – user2514224

0

좋습니다. request.ip 모델에서 작동하지 않기 때문에 가장 쉬운 방법은 컨트롤러를 사용하는 것입니다.

class OffersController<ApplicationController 

def create 
    @offer = Offer.new(offer_params) 
    if @offer.current_location 
    @offer.ip_address = request.ip 

... 
    end 
end 

또한 로컬 호스트 주소를 반환하고 실제 IP 주소를 반환하지 않으므로 request.ip 메서드가 개발 모드에서 작동하지 않습니다.