在给定目录中遍历所有文件

3
我目前正在使用 cities gem 来填充数据库中的城市列表,以创建地址。我被要求删除这个gem,并读入附带 cities gem 的城市文件夹中的所有 json 文件。
我查看了几篇关于如何实现这一点的 SO 帖子,包括:Iterate through every file in one directory 在使用 Dir.glob 时,我的应用程序会在该特定页面上完全崩溃并退出服务器。
否则,使用 Dir.foreach,我得到
Errno::ENOENT in StuffsController
No such file or directory @ dir_initialize

对于这个错误,我尝试了这篇SO帖子,但意识到我真的不能更新我的Gemfile,因为它会给我带来更多的问题。
以下是产生Errno::ENOENT的代码:
@okay = Array.new
Dir.foreach("#{Rails.root}/cities/*.json") do |json_file|
  @okay << JSON.parse(File.read(json_file))
end

我也尝试了来自这篇SO帖子下面的代码,但是出现了
NameError in StuffsController
undefined local variable or method `id' for # <StuffsController>


@okay = Array.new
Dir.foreach("#{Rails.root}/cities/#{id}.json") do |json_file|
    @okay << JSON.parse(File.read(json_file))
end

我可以轻松读取该文件夹中的单个文件,没有任何问题:

@cities = Array.new
@json = JSON.parse(File.read('cities/AD.json'))
@json.each do |j|
  if j.second.has_key?("accentcity")
    @cities << j.second.select {|k,v| k == "accentcity"}
    name = j.second.select {|k,v| k == "accentcity"}
    City.first_or_create(name: name)
  end
end

请注意,@cities 数组主要用于测试我的方法是否产生了我想要的结果。

我正在使用 Ruby on Rails 版本 4.2.6。


你的应用程序因 glob 崩溃后,日志文件包含了什么内容? - Eric Duminil
1个回答

6

Dir.foreach 在这里不是正确的方法。它的参数应该是一个目录,而不是一个 glob 模式。在你的情况下,它会在你的 Rails 项目中寻找一个名为 "cities/*.json" 的实际目录,显然不存在。

如果只有 cities/ 中有 .json 文件,你可以使用 Dir.foreach("#{Rails.root}/cities/")

Dir.glob 应该是正确的方法。你能否请展示一下当你的服务器崩溃时所得到的错误信息?

只要所有的 json 文件在 "cities" 中都是有效的,这段代码应该可以正常工作:

@okay = Dir.glob("#{Rails.root}/cities/*.json").map do |json_file|
    JSON.parse(File.read(json_file))
end 

好的,我尝试过了,但是当我尝试加载索引页面时,它会导致Rails服务器崩溃(将其放置在控制器的索引操作中)。 - developer01
是因为我将它存储到数组中吗?我需要将它添加到其他地方吗? - developer01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接