迭代给定目录中的所有文件

时间:2017-02-05 21:17:16

标签: ruby file ruby-on-rails-4 directory iteration

我目前正在使用cities gem填充数据库中的城市列表以创建地址。我被要求删除这个gem,并从cities gem附带的cities文件夹中读取所有json文件。

我已经查看了几个关于如何实现这一点的SO帖子,包括:Iterate through every file in one directory

Dir.glob实施后,我的应用程序在该特定页面上完全崩溃并退出/退出服务器。

否则,Dir.foreach,我得到

Errno::ENOENT in StuffsController
No such file or directory @ dir_initialize

对于这个错误,我尝试了this SO post,但意识到我真的无法更新我的Gemfile,因为它会给我带来更多问题。

以下是我生成Errno::ENOENT的代码:

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

我还尝试了this SO post中的以下代码,但收到了

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

我可以让它用于从该文件夹中读取单个文件,100%没问题:

@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。

1 个答案:

答案 0 :(得分:2)

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

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

Dir.glob应该是正确的方法。您能否告诉我们您的服务器崩溃时收到的错误消息?

如果"cities"中的所有json文件都有效,则此代码应该有效:

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