2017-02-05 5 views
0

В настоящее время я использую cities gem для заполнения списка городов в базе данных для создания адресов. Меня попросили удалить этот драгоценный камень и прочитать все json-файлы из папки городов, которая поставляется с драгоценными камнями городов.Итерация по всем файлам в данном каталоге

Я смотрел несколько так сообщений о том, как сделать это реализовать, в том числе: 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.

+0

Что файл журнала содержит после того, как ваше приложение аварий с Глоб? –

ответ

0

Dir.foreach здесь неправильный метод. Его параметр должен быть каталогом, а не шаблоном glob. В вашем случае он ищет каталог, который буквально называется "cities/*.json" в проекте Rails, которого, очевидно, не существует.

Если только .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 
+0

хорошо, я пробовал это, но он убил сервер rails, когда я попытался загрузить страницу индекса. (помещал его в индексное действие контроллера). – earlyriser01

+0

Это потому, что я храню его в массиве? Нужно ли добавлять его к чему-то еще? – earlyriser01

Смежные вопросы