【发布时间】:2016-04-18 16:01:49
【问题描述】:
我正在使用 sinatra/sinatra-settings 开发一个 ruby 网站,尝试从 config.yml 访问变量时出现以下错误。
我的主要应用是:
require 'sinatra'
require 'sinatra/reloader'
require 'sinatra/config_file'
require_relative 'web_data'
class Main < Sinatra::Base
register Sinatra::ConfigFile
config_file 'config.yml'
puts settings.inspect
c = Marshal.load(File.read(settings.svp)) rescue WebData.new(0)
get '/a/:name' do
c.increment
File.open(settings.svp, 'w') {|f| f.write(Marshal.dump(c)) }
"Hello, #{params[:name] ? params[:name] : 'world'}!"+c.getcount.to_s
end
end
我的config.yaml 是:
svp: app/systemvalues
抛出的错误是:
2016-01-13 15:35:17 - NoMethodError - undefined method `svp' for Main:Class:
/home/miguel/workspace/personal_website/app/app.rb:16:in `block in <class:Main>'
我尝试添加寄存器 Sinatra::ConfigFile,但无济于事。
哦,然后将 settings.inspect 打印出Main(类名)
【问题讨论】:
-
你的配置文件是
config.yml还是config.yaml?如果您在get块内执行p settings会打印什么? -
嗨,
config.yml和p settings打印“主要” -
在旁注中,找到了一种解决方法:
config = YAML.load(File.read('config.yml'))和 `config['svp'] 来访问 yml 参数 -
puts settings.inspect将始终是加载配置的类名。所以Main是预期的结果。要检查您的配置文件是否实际加载,请尝试在config_file 'config.yml'行的正下方添加puts settings.methods(false).inspect。如果加载正确,您应该会在结果中看到svp方法。例如,[:app_file=, :app_file, :app_file?, :environments=, :environments, :environments?, :svp=, :svp, :svp?]我猜这是一个相对路径问题。你用什么命令来启动你的应用程序?应用根目录中的ls -1会返回什么?