Конвейер активов и изображения, хранящиеся в базе данных - PullRequest
2 голосов
/ 06 марта 2012

У меня есть приложение Rails 3.1, в котором загруженные пользователем изображения хранятся в базе данных. Я использую выделенный путь для обслуживания этих изображений через контроллер Rails. Вот часть моих маршрутов.

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 Ответ

3 голосов
/ 06 марта 2012

Как насчет генерации тега изображения самостоятельно без конвейера ресурсов, т.е. назовите маршрут:

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 вашего контроллера будет вызываться с идентификатором книги в качестве параметра.

...