2016-06-21 5 views
0

Sinatra 응용 프로그램에서 DataMapper 모델과 함께 Geocoder gem을 사용하려고합니다.Sinatra 및 DataMapper와 함께 Geocoder 사용

environment.rb :

require 'rubygems' 
require 'bundler/setup' 
require 'dm-core' 
require 'dm-timestamps' 
require 'dm-validations' 
require 'dm-aggregates' 
require 'dm-migrations' 
require 'dm-types' 
require 'geocoder' 

require 'sinatra' unless defined?(Sinatra) 

# load models 
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/lib") 
Dir.glob("#{File.dirname(__FILE__)}/lib/*.rb") { |lib| require File.basename(lib, '.*') } 

DataMapper.setup(:default, (ENV["DATABASE_URL"] || "sqlite3:///#{File.expand_path(File.dirname(__FILE__))}/#{Sinatra::Base.environment}.db")) 
DataMapper.finalize 
DataMapper.auto_upgrade! 

lib/location.rb :

class Location 
    include DataMapper::Resource 
    include Geocoder::Model::Base 

    property :id, Serial 
    property :address, String, :required => true 

    # geocoder gem 
    geocoded_by :address, :latitude => :lat, :longitude => :lng 

    # geocoder 
    after_validation :geocode, :if => :address_changed? 

    end 

내가 IRB 세션을 시작하려고

, 예외가 생성됩니다

내가 이해하고 있지 않다 무엇
irb> require './environment' 
NameError: uninitialized constant Geocoder::Model 
... 

?

답변

0

먼저 지오 코드 보석이 Datamapper에 대한 직접 지원을하지 않는 것 같습니다 (as per this issue).

둘째, 클래스 내에 모듈을 포함하면 메서드를 클래스 수준이 아닌 클래스 인스턴스에서 사용할 수 있습니다. 예를 들어 :

module Name 
    def name 
    puts "Module" 
    end 
end 

class SomeClass 
    include Name 
end 

SomeClass.new.name # => "Module" 

이 작동하면 include 모듈이 해당 모듈은 해당 클래스의 상위 체인에 추가됩니다 때 때문이다. 인스턴스에서 사용할 수없는 인스턴스로 보내지는 메소드는 조상에게 전달됩니다. 그러나, 클래스 수준에서가 아니라 인스턴스 수준에서 방법을 추가 extend라는 또 다른 방법이있다 :

# module definition same as before 

class SomeClass 
    extend Name 

    name # works! 
end 

은 무엇 Geocoder gem uses for supported models 또 다른 방법입니다 (중위 클래스 수준의 포함을 얻기 위해이되는 :

included 후크는 include Name 단계는이 단계를 실행하지 아니 Datamapper 특정 모듈이 없기 때문에, 당신은 그 오류를 참조하십시오. 실행할 때 뭔가를 오버라이드 (override) 할 수있는 모델을 제공한다
# module code same as before 

module Name 
    def name 
    puts "Module" 
    end 

    def self.included(klass) 
    klass.extend(self) 
    end 
end 

.

+0

@craig 편집 해 주셔서 감사합니다! – Kashyap