Приложение Rails 3 + гем скрепки + производственный режим = загрузка пустых файлов

Я установил драгоценный камень скрепки для приложения Rails 3. В режиме разработки все работает нормально. Однако при работе в производственном режиме, если я загружаю файл, а затем пытаюсь загрузить его снова, он загружает файл с правильным именем и расширением, но это пустой файл. При поиске на сервере файл загружается и находится в правильном каталоге. (У меня есть папка «Загрузки» в корне моего приложения.)

У кого-нибудь было такое?

Моя модель:

# app/models/document.rb
class Document < ActiveRecord::Base  
  belongs_to :kase  

  has_attached_file :document, :path => (Rails.root + "uploads/:class/:kase_id/:id").to_s, :url => ":class/:id"

  validates_attachment_presence :document
  validates_attachment_content_type :document, :content_type => [
    'application/pdf',
    'image/png',
    'image/jpeg',
    'image/pjpeg',
    'text/plain'
  ]
end

Мой контроллер:

# app/controllers/documents_controller.rb
class DocumentsController < ApplicationController
  respond_to :html

  before_filter :initialize_kase # Sets the @kase instance

  def show
    @document = @kase.documents.find(params[:id])
    send_file @document.document.path, :filename => @document.document_file_name, :content_type => @document.document_content_type
  end    
end

И мой инициализатор (устанавливающий заполнитель :kase_id, используемый в has_attached_file выше:

# config/initializers/paperclip.rb
Paperclip.interpolates('kase_id') do |attachment, style|
  "kases/#{attachment.instance.kase.id.to_s}"
end

Я, вероятно, также должен упомянуть, что я обращаюсь к этому как к вложенному контроллеру (/kases/XX/documents/XX). Не знаю, повлияет это или нет...


person robertwbradford    schedule 07.06.2011    source источник
comment
Можете ли вы опубликовать конфигурацию вашего загрузчика и описать сервер, который вы используете?   -  person Devin M    schedule 08.06.2011
comment
В частности, нам нужен код вашей модели и код контроллера, на который загружается файл. У меня была эта проблема раньше, и я решил ее.   -  person Preacher    schedule 08.06.2011
comment
Извини за это. Мне пришлось бежать, прежде чем я смог добавить код. Я обновил ОП.   -  person robertwbradford    schedule 08.06.2011


Ответы (2)


Если вы используете Apache и Passenger (возможно, и другие серверы) и у вас есть строка:

config.action_dispatch.x_sendfile_header = "X-Sendfile"

в вашем файле окружения production.rb у вас есть два варианта:

  1. Установите модуль apache mod-xsendfile
  2. Закомментируйте эту строку и позвольте Rails отправлять файлы вместо Apache, как это делается в режиме разработки.
person Cameron Walsh    schedule 08.06.2011
comment
В итоге я закомментировал эту строку в config/environments/production.rb, и, похоже, она работает. Спасибо! - person robertwbradford; 08.06.2011

Вы переносите каталог загрузки каждый раз, когда развертываете свое приложение в рабочей среде? Предполагая, что вы используете capistrano (или аналогичный) для развертывания, каждый раз, когда вы развертываете, вы можете создавать новый каталог для загрузки в недавно развернутом каталоге выпуска. В этом случае ранее загруженные файлы находятся в более старых развернутых выпусках (если вы их не удалили) и больше не будут доступны для вашего приложения.

Вы хотите создать, например. shared/uploads каталог, который связан с вашим приложением при каждом развертывании.

person Jeremy Weathers    schedule 08.06.2011
comment
В настоящее время я не использую capistrano, но это действительно отличная информация, когда я доберусь до этого момента. Спасибо за внимание. - person robertwbradford; 08.06.2011