如何下载具有id参数的文件?

时间:2019-07-08 19:25:03

标签: ruby-on-rails ruby

您好,我尝试通过验证Post是否存在并通过在参数中恢复其ID来在rails上下载jpeg图像。

我尝试了一些操作,但是出现错误...我告诉你:

def download
  send_file '/public/uploads/posts/@image/image.jpg', :type => 'image/jpeg', :disposition => 'attachment', :x_sendfile => true
end

private

def set_image
  @image = Post.find(params[:id])
end

在我的控制器中,我必须在自己的路线上进行下载。

我的link_to是:

<%= link_to "Download", download_posts_path %>

但是rails对我说:“没有ID找不到Post”。 我不明白为什么...他没有身份证,但我不知道为什么?

2 个答案:

答案 0 :(得分:1)

假设您在set_image过滤器中使用before_action

首先,您应该将post实例或ID传递给您的路线帮助器:

如果您的路线有参数,例如/posts/:id/download

<%= link_to "Download", download_posts_path(@post) %>
<%= link_to "Download", download_posts_path(@post.id) %>

如果没有,则可以使用查询参数传递它,例如posts/download/?id=1

<%= link_to "Download", download_posts_path(id: @post.id) %>

这两种解决方案都会为您的控制器提供一个params[:id]。否则params[:id]将是nil,并且find会引发错误。

然后,@ DileepNandanam指出download操作中存在错误。您根本没有使用Post实例(@image),您只是向send_file传递了一个包含“ @image”的字符串,而不是变量,而只是一个字符串。您可能需要使用插值来建立图像的有效路径。例如,如果您的@image有一个:name可能是"image.jpg",您可以这样做:

send_file "/public/uploads/posts/#{@image.name}"

或者您也可以使用post id来命名图像,例如13.jpg,然后即可:

send_file "/public/uploads/posts/#{@image.id}.jpg"

或者甚至用帖子的id创建单独的伪造者:

send_file "/public/uploads/posts/#{@image.id}/image.jpg"

答案 1 :(得分:1)

send_file "/public/uploads/posts/#{@image.image_file_name}/image.jpg", :type => 'image/jpeg', :disposition => 'attachment', :x_sendfile => true

image_file_name方法可能会有所不同,具体取决于您在模型上指定的附件

更好的方法是使用url作为附件

send_file @image.image.url(:original)