1

私のmysqlデータベースには3つのファイルがあります。そのうちの 2 つは「text」タイプで、1 つは「longblob」タイプです。

|username| |pem      | |key       | |cert              |

|test1   | |some text| |Some text | | Some binary text |

|test2   | |some text| |Some text | | Some binary text |

それらをクエリして、@user_files 変数に配列 ActiveRecord Relation オブジェクトを含めることができます。

ここで、各ユーザーに対して filename1.pem、filename1.key、filename1.cert の 3 つのファイルを作成し、それらをダウンロード用のリンクとして提供します。

何かのようなもの:

<%- @user_files.each do |user_info| %>
  <tr>
    <td><%= link_to 'Download Files', download_path(user_info) %></td>
  </tr>
<% end %>

コントローラーでこれまでに頭に浮かんだことは次のとおりです。

 def download(user_file)
    temp = Tempfile.new("temp-filename-#{Time.now}")
    Zip::ZipOutputStream.open(temp.path) do |z|
      z.put_next_entry("some_name.pem")
      z.print IO.read(user_file.pem)
      z.put_next_entry("some_name.key")
      z.print IO.read(user_file.key)
      z.put_next_entry("some_name.cert")
      z.print IO.read(user_file.cert)
     end
     send_file temp.path, :type => 'application/octet-stream', :filename => "some_name.zip"
    temp.close  
 end

次のエラーが表示されます。

wrong number of arguments (0 for 1)
app/controllers/my_controller.rb:16:in `download'

私のルートは次のとおりです。

get 'download' => 'my_controller#download', as: :download

私の最初の質問は、これが正しいアプローチであり、機能するかどうかです。誰かが私の要件に対するよりクリーンなアプローチに私を導くことができれば幸いです。

編集:paramsを使用するように更新しました

<%= link_to 'ファイルのダウンロード, download_path(user_info) %>

def download
  user_info = params[:id]
  #remaining code
end

また、回答で提案されているルートの更新後に、このエラーが発生します。

No route matches [GET] "/download/415"
4

1 に答える 1