2014-02-18 2 views
1

Я пытаюсь преобразовать строки вложенного текстового файла с помощью процессора Paperclip в рельсах. Я могу проверить с помощью отладчика, что мой процессор вызывается, но прикрепленный файл является моим исходным файлом, а не файлом, написанным процессором. Вот мой процессор:Процессор Paperclip не меняет содержимое файла

module Paperclip 
    class Utf8 < Processor 
    def initialize(file, options={}, attachment=nil) 
     super 
     @file   = file 
     @attachment  = attachment 
     @current_format = File.extname(@file.path) 
     @format   = options[:format] 
     @basename  = File.basename(@file.path, @current_format) 
    end 

    def make 
     @file.rewind 
     tmp = Tempfile.new([@basename, @format]) 

     IO.foreach(@file.path) do |line| 
     tmp << line.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '') 
     end 

     tmp.flush 
     tmp 
    end 
    end 
end 

и вот моя модель:

class List < ActiveRecord::Base 
    has_attached_file :file, 
        storage: :s3, 
        s3_credentials: Rails.root.join('config', 'aws.yml'), 
        bucket: Rails.application.config.s3_bucket, 
        processors: [:utf8], 
        styles: { 
         utf8: { 
          format: 'txt' 
         } 
        } 
end 

Любая идея, что я делаю не так? Как я понимаю, файл, возвращенный из make, - это то, что скрепка прикрепляется к модели. Может ли s3 иметь к этому какое-нибудь отношение?

+0

Может быть, это не ваш случай, но то, что скрепка в общем случае является сохранить исходное имя файла в базе данных и в зависимости от которые вы определяете, хранит разные версии в файловой системе. Оригинал плюс преобразования. Итак, то, что вы получаете как приложение, зависит от того, как вы отправляете его в браузер. В вашем случае вам, вероятно, нужно сообщить своему диспетчеру, как отправить файл. –

+0

А, я вижу это сейчас. Каждый процессор сохраняет новую версию файла. Как мне отправить контроллер другим стилям? – mockaroodev

ответ

1

Нашли решение: paperclip сохраняет каждый стиль как отдельный файл. Для перезаписи исходного файла вместо создания нового, я должен был изменить свою модель, чтобы:

class List < ActiveRecord::Base 
    has_attached_file :file, 
        storage: :s3, 
        s3_credentials: Rails.root.join('config', 'aws.yml'), 
        bucket: Rails.application.config.s3_bucket, 
        processors: [:utf8], 
        styles: { 
         original: { # specifying original style here causes the original file to be overwritten 
          format: 'txt' 
         } 
        } 
end 
Смежные вопросы