2

私は Sinatra 用の config.ru ファイルを作成しようとしています。ここでは、開発と運用の各環境に 1 セットのデータベース資格情報があります。私は次のことをしています:

app.rb:

require 'sinatra'
require 'data_mapper'
require 'dm-mysql-adapter'

DataMapper.setup(:default, "mysql://#{settings.db_user}:#{settings.db_password}@#{settings.db_host}/#{settings.db_name}")

# ... the rest of the app

config.ru:

require 'sinatra'
require './app.rb' # the app itself

configure :development do
  set :db_name, 'thedatabase'
  set :db_user, 'root'
  set :db_password, ''
  set :db_server, 'localhost'
end

run Sinatra::Application

しかし、を使用してアプリを起動しようとすると、ruby app.rb「Sinatra::Application:Class (NoMethodError) の未定義メソッド 'db_user'」が表示されます。

一般的に、私はこれらすべての設定を独自のファイルにオフロードしようとしています。もし config.ru が彼らのための場所でないなら、これを行う適切な方法は何でしょうか?

4

3 に答える 3

3

どうやら順番の問題のようです。そのDataMapper.setup(...)行が実際に のトップ レベルにある場合は、が実行app.rbされるとすぐに呼び出されます。require './app.rb'configure

ファイルをロードするときは何もしないのが最善です。代わりに、何らかの形式の明示的または遅延初期化を使用してください。

于 2013-01-20T22:27:52.673 に答える
0

私はトーマスに同意します。これは私にとっても混乱を招くことがあったので、なぜこれがこのように機能するのかをお見せしたいと思います. 以下は、Ruby が require とクラスの開始を解釈する方法です。

#user.rb
class User
  def hello
    puts "hello"
  end
end

#config.ru
require 'user' # Here we include the original User class

class User # on this line we reopen the user class
  def goodbye # We add a new method to the user class
   puts "goodbye"
  end
end

requireconfig.ruのユーザーの後で、クラスを再度開く前にユーザーを呼び出すと、goodbyeメソッドにアクセスできません。ただし、クラス定義を再度開いて追加すると、できるようになります。これは Sinatra メソッドの関数でもありset、開いている Sinatra クラス内でのみ呼び出すことができる理由です。そのため、setメソッドを使用しない代替方法も時々見られます。config.ru で Sinatra クラスのものを要求または含めると、Sinatra アプリケーションで広く利用できるようになります。

問題を引き起こすもう1つの一般的なことは、SinatraがRackに基づいて構築されているため、Rackクラスを開いてそこで構成することも、これらの変更をSinatraで利用できるようにすることです。

于 2013-01-21T08:27:05.223 に答える