Предполагается, что вы используете set_image
в фильтре before_action
.
Сначала вы должны передать экземпляр или идентификатор post
вашему помощнику маршрута:
Если ваш маршрут принимает параметры, например, /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
вызовет ошибку.
Тогда в действии download
что-то не так, как указал @DileepNandanam. Вы вообще не используете свой экземпляр 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"
Или даже создать отдельные фордеры с идентификаторами поста:
send_file "/public/uploads/posts/#{@image.id}/image.jpg"