Sinatra不了解config.ru中的设置?

时间:2013-01-20 22:18:02

标签: ruby sinatra rack

我正在尝试为Sinatra编写一个config.ru文件,其中我为每个环境提供了一组数据库凭据:开发和生产。我正在做以下事情:

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启动应用程序时,我得到了“未定义的方法'db_user'用于Sinatra :: Application:Class(NoMethodError)”。

通常,我只是想将所有这些设置卸载到自己的文件中。如果config.ru不适合他们,那么这样做的适当方法是什么?

3 个答案:

答案 0 :(得分:3)

看起来这可能是一个订购问题。如果DataMapper.setup(...)行确实位于app.rb的最高级别,则require './app.rb'运行之前configure会立即调用它。

加载文件时最好不要做任何工作。使用某种形式的显式或延迟初始化。

答案 1 :(得分:0)

我同意托马斯的观点。这有时让我感到困惑,因此我想告诉你为什么这样的工作。以下是Ruby解释需要和类开放的方式。

#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

如果我们在config.ru中的用户require之后调用用户,但在重新打开课程之前,我们无法访问goodbye方法。但是,在重新打开类定义并添加它之后我们就可以了。这也是Sinatra set方法的功能,也是它只能在一个开放的Sinatra类中调用的原因。这就是为什么您有时也会看到不使用set方法的替代方法。在您的config.ru中要求或包含Sinatra课程中的内容将在您的Sinatra应用程序中广泛使用。

导致问题的另一个常见问题是Sinatra是基于Rack构建的,因此打开Rack类并配置其中的东西也可以在Sinatra中进行这些更改。

答案 2 :(得分:0)

config.ru仅在您使用rakeup启动应用时才会被使用。 如果您使用'ruby app.rb'启动应用程序,则config.ru不会发挥作用。