4

正常に動作するweb.rbファイルがあります。すべてのrequireファイルを1つのrequires.rbファイルに移動し、すべての.rbファイルからこのファイルを呼び出し、呼び出し元のファイル名に基づいて条件を使用して、必要なものを要求したいと思いました。

'require pp''ruby-growl'でテストしたところ、問題なく動作しました。require sinatraただし、が別のファイルにある場合、sinatraはロードされません。

require sinatra別のファイルに入れることはできますか?または、一般的に、別のファイルで要求することはできますか?

を使用して

  • ルビー1.8.7(2010-08-16パッチレベル302)[i386-mingw32]
  • シナトラ(1.3.2)
  • 宝石1.3.7

  • dosウィンドウからスクリプトを実行するruby script_name.rb

私のrequires.rbの最初の行は以下のとおりです。web.rbを実行すると、「Webの読み込みに必要です」というテキストが表示されます。すべての.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]}) 

アップデート

テストケースを簡略化しました。2つのファイルがあります。test.rbのみを使用し、ファイルでrequireする場合。すべてが正常に動作します。test_require.rbファイルを使用すると、「読み込み中」のテキストが表示され、test.rbの完了に1秒ほどかかるため、何かが読み込まれている、または何かが処理中であると言えます。

test.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/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サーバーにアクセスできません。そして、メッセージはまったくありません。うーん、空の行が1つあります

4

1 に答える 1

5

Sinatra プログラムを のようなもので直接実行するとruby my_app.rb、Sinatra は Web サーバーを自動的に起動できます。Sinatraは、設定が であるかどうかをチェックすることによって、このビルトイン サーバーを実行するかどうかを決定します:runtrue

値のデフォルトは、設定が実行中の Ruby ファイルと同じ:runかどうかをチェックすることによって決定されます。:app_file$0

Sinatraは、を実行する最初のファイルを使用してのデフォルト値を決定します:app_filerequire 'sinatra'。この場合、thenrequire 'sinatra'の先頭にがあると、Sinatra がビルトイン サーバーを起動します。を使用するとは ですが、Sinatra を必要とするファイルは であり、そのためはであり、それらが一致しないため、組み込みサーバーは起動されません。test.rb:app_file$0test_require.rb$0test.rb:app_filetest_require.rb

これを修正する:app_fileには、test.rb(web.rbまたはどこでも)で明示的に設定できます。

set :app_file, __FILE__

Sinatra を要求した後で、これを行う必要があります。を直接設定することもできますが:run、これは組み込みサーバーを毎回実行するため柔軟性が低くなりますconfig.ru

enable :run

require 'sinatra'これで問題は解決するはずですが、個人的には、Sinatra コードと一緒にしておく方がよいと思います。

于 2012-05-22T02:16:31.717 に答える