您好,我尝试通过验证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”。 我不明白为什么...他没有身份证,但我不知道为什么?
答案 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)