我正在尝试为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不适合他们,那么这样做的适当方法是什么?
答案 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不会发挥作用。