【发布时间】:2012-03-06 07:02:52
【问题描述】:
我有一个 Rails 3.1 应用程序,其中用户上传的图像存储在数据库中。我正在使用专用路径通过 Rails 控制器提供这些图像。这是我的路线的一部分。rb:
get "images/book_covers/:book_id", :controller => :book_covers, :action => :show
get "assets/book_covers/:book_id", :controller => :book_covers, :action => :show
这是来自控制器的代码:
class BookCoversController < ApplicationController
def show
if @image = BookCover.find_by_book_id(params[:book_id])
send_data(@image.image, :type => @image.content_type, :filename => "book_cover_#{@image.book_id}", :disposition => 'inline')
else
render :file => "#{RAILS_ROOT}/public/404.html", :status => 404
end
end
end
这一切在开发模式下运行良好(因为资产流水线被禁用),但是当我在生产环境中尝试应用程序时,我得到(可以预见的,我想)错误:“ActionView::Template::Error (book_covers/61未预编译)”。这是渲染图像的代码:
<%= image_tag book[:cover_image], :class => book[:cover_source].downcase %>
我宁愿不为整个应用禁用资产流水线,仅针对这些图像。我怎样才能做到这一点(或者我只是错误地处理了整个问题)?
【问题讨论】:
-
你使用了一些 assets_host 配置?
-
book[:cover_image]究竟返回了什么? -
@shingara 我正在使用默认的 assets_host 配置——事实上我没有自定义任何资产配置值。 book[:cover_image] 返回一个相对路径(例如 BookCoversController 处理的“book_covers/1”)。
-
如果您从数据库中提取数据,我认为资产管道没有任何用途。使用每个@Wolfgang 的控制器为他们服务,并让他们远离/assets。您还可以在控制器操作中将它们写入 /public,以便在 Web 服务器将来的请求中提供它们。
标签: ruby-on-rails image asset-pipeline