【问题标题】:Asset Pipeline and Images stored in the database存储在数据库中的资产管道和图像
【发布时间】: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


【解决方案1】:

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

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 ) %>

现在资产管道甚至不知道您的图像,并且控制器的显示操作将使用图书的 id 作为参数调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2017-12-27
    • 2023-03-26
    • 1970-01-01
    • 2022-08-15
    相关资源
    最近更新 更多