我有web.rb文件,工作正常.我想在一个requires.rb文件中移动所有require文件,并从我的所有.rb文件中调用此文件,并根据调用者文件名使用条件来要求所需的内容.
我在'require pp','ruby-growl'上测试了它并且它运行良好.但如果require sinatra在另一个文件中,sinatra将无法加载.
我可以require sinatra在不同的文件中吗?或者更好一般我可以在不同的文件中要求吗?
运用
宝石1.3.7
从dos窗口运行脚本 ruby script_name.rb
我的requires.rb的第一行很少在下面.当我运行web.rb时,我可以看到"加载网络需要"的文字.请注意,我需要所有.rb文件的'rubygems'.如果我评论"require"sinatra',我会收到一条错误消息'web.rb:17:uninitialized constant Rack(NameError)'.如果没有注释require,ruby会在屏幕上没有任何消息的情况下完成,也没有错误消息.
called_from=caller[0].split(":")[0]
puts "loading web 'requires' for file: #{called_from} ..." if (["web"].any?{|s| called_from[s]})
require "c:\\edutester\\others\\settings.rb"
require 'rubygems'
require 'sinatra' if (["web"].any?{|s| called_from[s]})
Run Code Online (Sandbox Code Playgroud)
我简化了测试用例.我有两个文件.如果我在文件中只使用test.rb和require.一切正常.如果我使用test_require.rb文件,我可以看到"加载"文本,我会说某些东西正在加载或者某些东西正在处理,因为它需要一秒左右来完成测试.rb
test.rb
#require "c:\\edutester\\playground\\test_require.rb"
require 'rubygems'
require 'sinatra'
get '/' do
"yes"
end
Run Code Online (Sandbox Code Playgroud)
和test_require.rb
puts "loading..."
require 'rubygems'
require 'sinatra'
Run Code Online (Sandbox Code Playgroud)
Sinatra不会加载=我没有得到平常
== Sinatra/1.3.2 has taken the stage on 4567 for development with backup from Thin
>> Thin web server (v1.2.7 codename No Hup)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:4567, CTRL+C to stop
Run Code Online (Sandbox Code Playgroud)
我无法从浏览器访问Web服务器.根本没有消息.嗯,有一条空行
当您使用类似的东西直接运行Sinatra程序时ruby my_app.rb,Sinatra可以自动启动Web服务器.Sinatra 通过检查:run设置是否来确定是否运行此内置服务器true.
:run通过检查:app_file设置是否与正在执行的Ruby文件相同来确定值的缺省值,即$0.
Sinatra 通过使用执行的第一个文件确定默认值:app_filerequire 'sinatra'.在这种情况下,当你require 'sinatra'在顶部test.rb,然后:app_file就是$0,让西纳特拉启动内置的服务器.当你使用test_require.rb,$0是test.rb,但文件要求Sinatra,:app_file因此test_require.rb,并且,因为它们不匹配内置服务器没有启动.
要解决此问题,您可以:app_file在您的test.rb(web.rb或任何地方)明确设置:
set :app_file, __FILE__
Run Code Online (Sandbox Code Playgroud)
在你需要Sinatra 之后你需要这样做.您也可以直接设置:run,虽然这样会不那么灵活,因为它每次都会运行内置服务器,如果您使用的话,这是您不想要的config.ru:
enable :run
Run Code Online (Sandbox Code Playgroud)
虽然这可以解决您的问题,但我个人认为最好require 'sinatra'与Sinatra代码保持一致.
| 归档时间: |
|
| 查看次数: |
866 次 |
| 最近记录: |