我正在尝试添加一个帮助程序来连接mongo db到我的模块化Sinatra应用程序
当我在控制台中输入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文件或gem规范。我需要它们吗?
一些谷歌搜索也发现了这个:sinatra helper in external file
Dave Sag完美地回答了我的问题,但我无法让它发挥作用。
答案 0 :(得分: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
而不是helpers
。 register
会调用extend
,因此您最终会使用类级别方法(无论如何,如果您扩展了一个类)。然后,您可以将配置块设置为:
configure do |app|
$collection = app.connect
end
您也可以在DbHelpers模块的registered
方法中完成所有这些操作。请参阅文档中有关如何工作的示例。