外部文件中的Sinatra Helper给出了LoadError

时间:2012-10-05 20:31:36

标签: ruby sinatra

我正在尝试添加一个帮助程序来连接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完美地回答了我的问题,但我无法让它发挥作用。

1 个答案:

答案 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而不是helpersregister会调用extend,因此您最终会使用类级别方法(无论如何,如果您扩展了一个类)。然后,您可以将配置块设置为:

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

您也可以在DbHelpers模块的registered方法中完成所有这些操作。请参阅文档中有关如何工作的示例。