Ruby 读取Sinatra中的本地文件时出错
我正在尝试编写一个Sinatra应用程序,它从一个文件中读取一个列表,然后从该列表中吐出一个随机项 不过,我很难找到读取文件的路径。当我尝试在浏览器中加载项目时,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
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
单独存在?您的代码示例无法通过语法检查,因此需要反映您的真实代码。