Конвейер активов и изображения, хранящиеся в базе данных

У меня есть приложение Rails 3.1, в котором загруженные пользователем изображения хранятся в базе данных. Я использую выделенный путь для обслуживания этих изображений через контроллер Rails. Вот часть моего route.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 %>

Я бы предпочел не отключать конвейерную обработку ресурсов для всего приложения, а только для этих изображений. Как я могу это сделать (или я просто неправильно подхожу ко всей этой проблеме)?


person Jack R-G    schedule 06.03.2012    source источник
comment
Вы используете некоторую конфигурацию assets_host?   -  person shingara    schedule 06.03.2012
comment
Что возвращает именно book[:cover_image] ?   -  person shingara    schedule 06.03.2012
comment
@shingara Я использую конфигурацию assets_host по умолчанию — на самом деле я не настраивал ни одно из значений конфигурации ресурсов. book[:cover_image] возвращает относительный путь (например, book_covers/1, который затем обрабатывает BookCoversController).   -  person Jack R-G    schedule 06.03.2012
comment
Я не думаю, что конвейер активов служит какой-либо цели, если вы извлекаете данные из БД. Подавайте их с помощью контроллера @Wolfgang и держите их подальше от /assets. Вы также можете записать их в /public в действии контроллера, чтобы они обслуживались веб-сервером в будущих запросах.   -  person aceofspades    schedule 06.03.2012


Ответы (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 ) %>

Теперь конвейер ресурсов даже не будет знать о вашем изображении, и действие show вашего контроллера будет вызываться с идентификатором книги в качестве параметра.

person Wolfgang    schedule 06.03.2012