我有以下模型设置: 作业属于用户,作业有许多提交
提交属于用户,也属于作业
提交已附加文件(使用回形针)。
我希望作业用户(创建者)能够下载属于特定作业的文件(提交)。
我的路线结构如下:
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存档,当我想在其中添加内容时,该存档具有可行的路径来引用?如果是这样,我怎么能用rubyzip gem做到这一点?
谢谢!
答案 0 :(得分:2)
以下是我自己问题的答案:
在控制器中创建一个名为download的操作,然后在显示页面中正确引用它:
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 }%>