我的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 |
我可以查询它们并拥有一个数组ActiveRecord Relation对象在@user_files变量中。
现在,我想为每个用户创建三个文件filename1.pem、filename1.key和filename1.cert,并将它们作为下载链接提供。
类似于:
<%- @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
我的第一个问题是,这是否是正确的方法,它是否有效?如果有人能指导我采用更清洁的方法来满足我的要求,我将不胜感激。
编辑:我更新为使用参数
<%=link_to'下载文件,Download_path(user_info)%>
def download
user_info = params[:id]
#remaining code
end
在答案中建议的路线更新后,现在也会出现此错误:
No route matches [GET] "/download/415"
控制器操作不能有任何参数。您想传递给控制器操作的所有内容都由params
变量访问,该变量是Hash
(实际上是HashWithIndidifferenceAccess)。因此,您的download
操作可能看起来像:
def download
user_file = params[:id]
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
此外,将您的路线更改为:
get 'download/:id' => 'my_controller#download', as: :download