资产管道和存储在数据库中的图像

时间:2012-03-06 07:02:52

标签: ruby-on-rails image asset-pipeline

我有一个Rails 3.1应用程序,用户上传的图像存储在数据库中。我正在使用专用路径通过Rails控制器提供这些图像。这是我的一部分routes.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 %>

我不想为整个应用禁用资产管道,只是为了这些图片。我怎样才能做到这一点(或者我只是把整个问题接近错误)?

1 个答案:

答案 0 :(得分:3)

如何在没有资产管道的情况下自己生成图像标记,即首先命名路径:

get "images/book_covers/:book_id", :controller => :book_covers, :action => :show, :as => :book_cover_image

然后在模板中

<%= tag :img, :src => book_cover_image_path( book[:id], :class => book[:cover_source].downcase ) %>

现在资产管道甚至不知道你的图像,你的控制器的show动作将以书的id作为参数调用。