【问题标题】:Sinatra Helper in External File gives LoadError外部文件中的 Sinatra 助手给出 LoadError
【发布时间】:2012-10-06 07:16:11
【问题描述】:

我正在尝试添加一个帮助程序以连接到我的模块化 Sinatra 应用程序的 mongo db

当我在控制台中输入 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 helper in external file

Dave Sag 完美地回答了我的问题,但我无法解决问题。

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:

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

    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 而不是helpersregister 在后台调用 extend,所以你最终得到了类级别的方法(如果你扩展了一个类,无论如何)。然后,您可以像这样制作配置块:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2012-01-07
      • 2012-08-25
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多