У меня есть следующая настройка модели: задания принадлежат пользователю, а задания имеют много представлений.
представления принадлежат пользователям, а также относятся к заданиям
материалы имеют прикрепленные файлы (с помощью скрепки).
Я хочу, чтобы пользователь задания (создатель) мог загружать файлы (представления), принадлежащие конкретному заданию.
Мои маршруты построены следующим образом:
resources :assignments do
resources :submissions
end
Итак, я думаю, мне нужно определить действие загрузки в моем контроллере заданий, которое создает zip-архив всех представлений, принадлежащих заданию, а затем перенаправляет непосредственно на этот URL-адрес файла для загрузки.
def download
@submissions = @assignment.submissions.all
input_filenames = @submissions.file_file_name.all
Zip::File.open(assignment.file.url+"/archive.zip", Zip::File::CREATE) do |zipfile|
input_filenames.each do |filename|
zipfile.add(filename, assignment_submission_file_path(@assignment.id, @submission.id)+ '/' + filename)
end
end
respond_to do |format|
format.html { redirect_to assignment.file.url }
format.json { head :no_content }
end
end
Затем на моей странице отображения заданий у меня есть следующее:
<%= link_to 'Download', @assignment.file.url(:original, false) %>
Но при нажатии я получаю сообщение об ошибке, что файл отсутствует:
No route matches [GET] "/files/original/missing.png"
Таким образом, файл zip-архива не создается, и поэтому моя маршрутизация к файлу не работает. Возможно, я сделал что-то не так, что очень просто, или что все это должно быть структурировано по-другому.
Или другой моей мыслью было: нужно ли мне создавать пустой zip-архив в действии create контроллера присваивания, чтобы был пустой zip-архив с жизнеспособным путем, на который можно ссылаться, когда я хочу добавить в него что-то? Если да, то как я могу сделать это с помощью драгоценного камня rubyzip?
Спасибо!