dev*_*r01 3 ruby directory iteration file ruby-on-rails-4
我目前正在使用城市 gem填充数据库中的城市列表以创建地址。我被要求删除这个 gem 并从城市 gem 附带的城市文件夹中读取所有 json 文件。
我看过几篇关于如何实现这一点的帖子,包括:迭代一个目录中的每个文件
在实现后Dir.glob,我的应用程序在该特定页面上完全崩溃并退出/退出服务器。
否则,随着Dir.foreach,我得到
Errno::ENOENT in StuffsController
No such file or directory @ dir_initialize
Run Code Online (Sandbox Code Playgroud)
对于这个错误,我尝试了这篇文章,但意识到我真的无法更新我的 Gemfile,因为它会给我带来更多问题。
这是我生成的代码Errno::ENOENT:
@okay = Array.new
Dir.foreach("#{Rails.root}/cities/*.json") do |json_file|
@okay << JSON.parse(File.read(json_file))
end
Run Code Online (Sandbox Code Playgroud)
我也尝试过这篇文章中的以下代码,但收到了
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
Run Code Online (Sandbox Code Playgroud)
我可以让它很好地从该文件夹中读取单个文件,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
Run Code Online (Sandbox Code Playgroud)
(请注意,该@cities数组主要用于测试我的方法是否产生了我想要的结果)
我正在使用 Ruby on Rails 版本 4.2.6。
Dir.foreach这里不是正确的方法。它的参数应该是一个目录,而不是一个 glob 模式。在您的例子中,它会查找在您的 Rails 项目中字面上调用的目录"cities/*.json",该目录显然不存在。
如果只有.json文件cities/,你可以使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4057 次 |
| 最近记录: |