Используйте rubyzip для загрузки вложений скрепки во вложенную модель

У меня есть следующая настройка модели: задания принадлежат пользователю, а задания имеют много представлений.

представления принадлежат пользователям, а также относятся к заданиям

материалы имеют прикрепленные файлы (с помощью скрепки).

Я хочу, чтобы пользователь задания (создатель) мог загружать файлы (представления), принадлежащие конкретному заданию.

Мои маршруты построены следующим образом:

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?

Спасибо!


person SOConnell    schedule 06.09.2013    source источник


Ответы (1)


Вот ответ на мои собственные вопросы:

создайте действие в контроллере, называемое загрузкой, а затем правильно обратитесь к нему на странице показа:

  def download
    @assignment = Assignment.find(params[:assignment])
    @submissions = @assignment.submissions.all

    file = @assignment.file.url(:original, false)

    Zip::ZipFile.open(file, create=nil) do |zipfile|
      @submissions.each do |filename|
        zipfile.add(filename.file_file_name, filename.file.url(:original, false))
      end
    end

И это вызов этого действия загрузки на странице показа:

<%= link_to "Download", {:controller => "assignments", :action => "download", :assignment => @assignment.id }%>
person SOConnell    schedule 14.09.2013
comment
Это работает! Спасибо, а что делает этот бит? file, create=nil. Вы пытаетесь просто издеваться над этим, не создавая настоящий почтовый индекс для конечного пользователя? - person Vlad Balanescu; 21.11.2016