2012-10-05 69 views
1

我想添加一個輔助連接到蒙戈DB到我的模塊化應用西納特拉西納特拉助手在外部文件給LoadError

當我在控制檯輸入foreman start我得到:

/home/sunny/Programs/landing_pages/app.rb:17:in `block in <class:LandingPages>': undefined local variable or method `connect' for LandingPages:Class (NameError) 

app.rb文件看起來像這樣:

require 'sinatra/base' 
require 'sinatra/partial' 
require 'sinatra/db_helper' 
require 'bundler/setup' 
require 'mongo' 

class LandingPages < Sinatra::Base 
    helpers Sinatra::DbHelper 

    configure do 
    $collection = connect 
    end 
end 

./lib/sinatra/db_helper.rb看起來是這樣的:

require 'sinatra/base' 

module Sinatra 
    module DbHelper 
    def connect 
     conn = Mongo::Connection.new("localhost") 
     db = conn.db("leads") 
     db.collection("laws") 
    end 
    end 

    helpers DbHelper 
end 

config.ru看起來是這樣的:

require './app' 

run LandingPages 

我以爲我是正確之後上的說明:

http://www.sinatrarb.com/extensions.html

,但我不能完全肯定。我沒有製作寶石,只是一個sinatra應用程序,所以也許我的目錄層次結構不正確。我沒有rake文件或寶石規格。我需要他們嗎?

一些谷歌搜索也發現了這一點:

sinatra helper in external file

戴夫凹陷回答我的問題很好,但我不能得到它的工作。

回答

1

這是因爲通過helpers創建的方法的範圍在sinatra應用程序實例中,因爲它在引擎蓋下調用ruby的include。因此,這會工作:

get '/some/route' do 
    db = connect 
    # do something else ... 
end 

但配置塊具有類範圍,因此它可用於配置應用程序的全過程。因此,爲了使這項工作,你可以將方法定義:

module Sinatra 
    module DbHelper 
    def self.connect 
     conn = Mongo::Connection.new("localhost") 
     db = conn.db("leads") 
     db.collection("laws") 
    end 
    end 
end 

可能然後通過被稱爲:$collection = Sinatra::DbHelper.connect或許更有利,你可以調用register,而不是helpersregister在引擎蓋下調用extend,所以你最終得到了類級別的方法(如果你擴展了一個類,反正)。然後,您可以使配置塊像這樣:

configure do |app| 
    $collection = app.connect 
end 

你也可以做這一切在DbHelpers模塊上的registered方法。請參閱文檔中的示例以瞭解這可能如何工作。