0

ファイルからリストを読み取り、そのリストからランダムなアイテムを吐き出す Sinatra アプリを作成しようとしています。

ただし、ファイルを読み取るためのファイルへのパスを理解するのに苦労しています。ブラウザでアイテムを読み込もうとすると、シナトラは「そのようなファイルやディレクトリはありません」と言います:

Errno::ENOENT at /wod
No such file or directory - http://localhost:4567/listing.txt

コードは次のとおりです。

require 'sinatra'

@list

get /item
  puts read_list[rand(@list.size)]
end

def read_list
  File.open('listing.txt', 'r').readlines
end

/publicSinatra README によると、これは静的ファイルをホストするためのデフォルトの場所です。さらに、それを入れると、ブラウザでファイルに/public移動しlocalhost:4567/listing.txtて読むことができます。

4

2 に答える 2

3

私が気づいたいくつかのこと:

get /item

正しくありません。次のようにする必要があります。

get '/item' do

Ruby コードと同じディレクトリ内でコードを開始すると、現在の作業ディレクトリは になります"."。これは、Ruby が次のことを試みるときに参照する場所です。

File.open('listing.txt', 'r').readlines

Ruby は実際に'./listing.txt'パスとして使用します。アプリケーションのルート ディレクトリからコードを手動で起動する場合は問題ありませんが、それ以外の場所から起動しようとするとうまくいきません。

Web サーバーで使用するために実際に何かを読み込もうとするときは、ファイルの場所を明示することをお勧めします。偶然に頼る代わりに、防弾を強化するためにできることがいくつかあります。このことを考慮:

def read_list
  running_dir = File.dirname(__FILE__)
  running_dir = Dir.pwd if (running_dir == '.')
  File.open(running_dir + '/public/listing.txt', 'r').readlines
end

File.dirnameからパス情報を取得します__FILE__。これは、現在実行中のファイルの絶対パスと名前です。アプリケーションがファイルと同じディレクトリから開始された場合、それは になりますが.、これは私たちが望んでいるものではありません。その場合、Dir.pwd返される現在の作業ディレクトリの絶対パスが必要です。次に、アプリケーションのルートから、必要なファイルのパスにそれを追加できます。

于 2012-10-26T01:32:34.510 に答える
2

File.read('public/listing.txt', 'r')ここで欲しいものを手に入れるには、やらなければならないことがあります。

File.openSinatra の一部ではなく、特定の場所で静的ファイルを検索する方法がわからないため、現在の作業ディレクトリを検索するだけです。

于 2012-10-26T00:36:27.193 に答える