4

我有 web.rb 文件可以正常工作。我想将所有需要文件移动到一个 requires.rb 文件中,并从我的所有 .rb 文件中调用此文件,并使用基于调用者文件名的条件来要求所需的内容。

我在'require pp''ruby-growl'上对其进行了测试,并且效果很好。require sinatra但如果 sinatra在另一个文件中,则不会加载。

我可以require sinatra在不同的文件中吗?或者一般来说我可以在不同的文件中有更好的要求吗?

使用

  • ruby 1.8.7 (2010-08-16 补丁级别 302) [i386-mingw32]
  • 西纳特拉 (1.3.2)
  • 宝石 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]}) 

更新

我简化了测试用例。我有两个文件。如果我在文件中只使用 test.rb 和 require 。一切正常。如果我使用 test_require.rb 文件,我可以看到“正在加载”文本,我会说正在加载或正在处理某些内容,因为完成 test.rb 需要一秒钟左右的时间

测试.rb

#require "c:\\edutester\\playground\\test_require.rb"

require 'rubygems' 
require 'sinatra'


get '/' do

    "yes"
end

和 test_require.rb

puts "loading..."
require 'rubygems' 
require 'sinatra'

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 

我无法从浏览器访问 Web 服务器。而且根本没有消息。嗯,有一个空行

4

1 回答 1

5

当您直接使用类似的东西运行 Sinatra 程序时ruby my_app.rb,Sinatra 可以自动启动 Web 服务器。Sinatra通过检查设置是否为 来确定是否运行此内置服务器:runtrue

value 的默认值:run是通过检查:app_file设置是否与正在执行的 Ruby 文件相同来确定的,即$0.

Sinatra通过使用执行的第一个文件来确定:app_filerequire 'sinatra'. 在这种情况下,当您在then isrequire 'sinatra'的顶部时,Sinatra 会启动内置服务器。当您使用, is时,需要 Sinatra 的文件,因此, is ,并且由于它们不匹配,因此不会启动内置服务器。test.rb:app_file$0test_require.rb$0test.rb:app_filetest_require.rb

:app_file要解决此问题,您可以在您的test.rb(或任何地方)中明确设置web.rb

set :app_file, __FILE__

在您需要 Sinatra之后,您需要执行此操作。您也可以直接 set :run,尽管这会不太灵活,因为它每次都会运行内置服务器,config.ru例如,如果您使用的是您不希望的:

enable :run

尽管这应该可以解决您的问题,但我个人认为将其require 'sinatra'与 Sinatra 代码保持在一起会更好。

于 2012-05-22T02:16:31.717 回答