2

次のモデル設定があります: 割り当てはユーザーに属し、割り当てには多くの送信があります

提出物はユーザーに属し、課題にも属します

提出物にはファイルが添付されています (ペーパークリップを使用)。

課題のユーザー (作成者) が、特定の課題に属するファイル (提出物) をダウンロードできるようにしたいと考えています。

私のルートは次のように構成されています。

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アーカイブを作成する必要がありますか? もしそうなら、どうすれば ruby​​zip gem でそれを行うことができますか?

ありがとう!

4

1 に答える 1