1

我的 mysql 数据库中有 3 个文件。其中 2 个是“文本”类型,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 对象。

现在,我想为每个用户创建 3 个文件 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"
4

1 回答 1

1

控制器动作不能有任何参数。您想传递给控制器​​操作的所有内容都可以通过params变量访问Hash(实际上是HashWithIndifferentAccess)。因此,您的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
于 2014-11-11T19:02:12.060 回答