1

モジュール式のSinatraアプリケーションにmongodbに接続するためのヘルパーを追加しようとしています

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ヘルパー

デイブサッグは私の質問に完全に答えますが、私はそれを機能させることができません。

4

1 に答える 1

1

これはhelpers、内部で ruby​​ を呼び出すため、sinatra アプリケーション インスタンスで作成されたメソッドのスコープが原因です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

これらすべてをregisteredDbHelpers モジュールのメソッドで行うこともできます。これがどのように機能するかについては、ドキュメントの例を参照してください。

于 2012-10-05T23:16:11.747 に答える