0

我正在尝试编写一个 Sinatra 应用程序,该应用程序从文件中读取列表,然后从该列表中返回一个随机项目。

不过,我很难找出文件的路径来读取它。当我尝试在浏览器中加载项目时,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

我有文件/public,Sinatra README 说它是托管静态文件的默认位置。此外,如果我把它放进去,/public我可以localhost:4567/listing.txt在浏览器中导航并读取文件。

4

2 回答 2

3

我注意到了几件事:

get /item

不正确,应该是:

get '/item' do

如果您在 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.open不是 Sinatra 的一部分,也不知道在特定位置查找静态文件,因此它只在当前工作目录中查找。

于 2012-10-26T00:36:27.193 回答