Ruby 读取Sinatra中的本地文件时出错

Ruby 读取Sinatra中的本地文件时出错,ruby,sinatra,Ruby,Sinatra,我正在尝试编写一个Sinatra应用程序,它从一个文件中读取一个列表,然后从该列表中吐出一个随机项 不过,我很难找到读取文件的路径。当我尝试在浏览器中加载项目时,Sinatra说“没有这样的文件或目录”: Errno::ENOENT at /wod No such file or directory - http://localhost:4567/listing.txt 代码如下: require 'sinatra' @list get /item puts read_list[ran

我正在尝试编写一个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自述文件说它是静态文件的默认宿主位置。此外,如果我把它放在
/public
中,我可以导航到
localhost:4567/listing.txt
并在浏览器中读取该文件

您需要执行
File.read('public/listing.txt','r')
来获取您想要的内容


File.open
不是Sinatra的一部分,不知道在特定位置查找静态文件,因此它只在当前工作目录中查找

您需要执行
File.read('public/listing.txt','r')
来获取您想要的内容


File.open
不是Sinatra的一部分,不知道在特定位置查找静态文件,因此它只在当前工作目录中查找

我注意到了几件事:

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

文件中获取路径信息,它是当前正在运行的文件的绝对路径和名称。如果应用程序是从与文件相同的目录启动的,那将是
,这不是我们想要的。在这种情况下,我们需要返回当前工作目录的绝对路径。然后我们可以从应用程序的根目录将其附加到所需文件的路径中。

我注意到以下几点:

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

文件中获取路径信息,它是当前正在运行的文件的绝对路径和名称。如果应用程序是从与文件相同的目录启动的,那将是
,这不是我们想要的。在这种情况下,我们需要返回当前工作目录的绝对路径。然后,我们可以从应用程序的根目录将其附加到所需文件的路径。

为什么
@list
单独存在?您的代码示例无法通过语法检查,因此它需要反映您的真实代码。为什么
@list
单独存在?您的代码示例无法通过语法检查,因此需要反映您的真实代码。