1

我正在尝试添加一个帮助程序以将 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

但我不完全确定。我不是在做一个 gem,而只是一个 sinatra 应用程序,所以我的目录层次结构可能不正确。我没有 rake 文件或 gem 规范。我需要它们吗?

一些谷歌搜索也发现了这一点:

外部文件中的 sinatra 助手

Dave Sag 完美地回答了我的问题,但我无法让它发挥作用。

4

1 回答 1

1

这是因为helpers在 sinatra 应用程序实例上通过 is 创建的方法的范围,因为它include在引擎盖下调用了 ruby​​。所以这会起作用:

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

但是 configure 块有一个类范围,因此它可以用于配置整个应用程序。因此,要使其工作,您可以将方法定义为:

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

您也可以registered在 DbHelpers 模块上的方法中完成所有这些操作。请参阅文档中的示例以了解其工作原理。

于 2012-10-05T23:16:11.747 回答