Приложение Rails 3 + скрепка для драгоценностей + режим производства = загрузка пустых файлов - PullRequest
1 голос
/ 08 июня 2011

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

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

Моя модель:

# 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 /документы / XX). Не уверен, оказывает ли это влияние или нет ...

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

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

config.action_dispatch.x_sendfile_header = "X-Sendfile"

в файле env production.rb, тогда у вас есть два варианта:

  1. Установите модуль apache mod-xsendfile
  2. Закомментируйте эту строку и позвольте Rails отправлять файлы вместо Apache, как это происходит в режиме разработки.
2 голосов
/ 08 июня 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...