使用 ruby​​zip 在嵌套模型中下载回形针附件

Posted

技术标签:

【中文标题】使用 ruby​​zip 在嵌套模型中下载回形针附件【英文标题】:Use rubyzip to download paperclip attachments within nested model 【发布时间】:2013-09-06 23:53:04 【问题描述】:

我有以下模型设置: 作业属于一个用户,作业有很多提交

提交属于用户,也属于作业

提交的文件带有附件(使用回形针)。

我希望作业用户(创建者)能够下载属于特定作业的文件(提交)。

我的路线结构如下:

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 存档,以便在我想向其中添加内容时有一个可行的路径来引用一个空的 zip 存档?如果是这样,我该如何使用 ruby​​zip gem 做到这一点?

谢谢!

【问题讨论】:

【参考方案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 %>

【讨论】:

这行得通!谢谢,虽然这个位在做什么? file, create=nil。您是否只是想模拟它,而不为最终用户创建实际的 zip?

以上是关于使用 ruby​​zip 在嵌套模型中下载回形针附件的主要内容,如果未能解决你的问题,请参考以下文章

回形针和嵌套属性问题

警告:在 ruby​​ 2.7.2 中使用回形针时,URI.escape 已过时

Ruby On Rails:获取回形针图像的 md5 哈希

使用回形针上传静态 zip 文件失败,并出现 Paperclip::AdapterRegistry::NoHandlerError for filename.zip

ruby 使用回形针修复json和text / plain问题

带有回形针的 If 语句 | Ruby on Rails