0

Я работаю над движком Rails 4.1, который обрабатывает загрузку пользователями фотографий и видео. Я использую Mongoid-Paperclip для обработки выгружаемых файлов и программ для конвертирования видео в несколько форматов. Все файлы хранятся на S3. Все это прекрасно работает, но, как вы можете ожидать, кодирование видео может занять довольно много времени, поэтому следующий шаг - сделать это в фоновом режиме. Я сделал несколько поисковых запросов и нашел Delayed_Paperclip, который, кажется, делает то, что мне нужно. После этого казалось, что Sidekiq был лучшим вариантом для обработки фоновой обработки.Delayed_Paperclip + Sidekiq + Mongoid-Paperclip

Теперь проблема в том, что я не могу сделать все это совместной работой. Выполняя мои модульные тесты, я получаю NoMethodError: undefined method 'process_in_background', поэтому, похоже, проблема остается на Delayed_Paperclip, хотя для нее нет специальной настройки.

Это модель стрельбы проблемы

module MyEngine 
    class Video 
    include Mongoid::Document 
    include Mongoid::Paperclip 

    has_mongoid_attached_file :file, 
     :path => ':hash.:extension', 
     :hash_secret => "the-secret", 
     :storage => :s3, 
     :url => ':s3_domain_url', 
     :s3_credentials => File.join(Rails.root, 'config', 's3.yml'), 
     :bucket => "my-bucket-#{Rails.env}", 
     :styles => { 
     :mp4 => { :format => 'mp4', :convert_options => { :output => { :vcodec => 'libx264', :acodec => 'copy' } } }, 
     :ogg => { :format => 'ogg', :auto_rotate => true }, 
     :webm => { :format => 'webm', :auto_rotate => true }, 
     :thumb => { :geometry => "250x187#", :format => 'jpg', :time => 10, :auto_rotate => true } 
     }, 
     :processors => [:transcoder] 

    validates_attachment :file, :content_type => { :content_type => ["video/x-flv", "video/mp4", "video/ogg", "video/webm", "video/x-ms-wmv", "video/x-msvideo", "video/quicktime", "video/3gpp"] } 

    process_in_background :file 
    end 
end 

Я пытался добавить require "delayed_paperclip" в файл lib/myengine/myengine.rb, но это не помогло.

Что касается Sidekiq, я добавил к test_helper.rb следующее:

require 'sidekiq/testing' 
Sidekiq::Testing.inline! 

Обратите внимание, что я не забыл запустить bundle install и Redis это и работает. Я использую Mongoid, а не активную запись.

Что я делаю неправильно? Кто-нибудь успешно использовал эту настройку? Есть ли еще одна комбинация драгоценных камней, которые я должен попробовать?

Доп информация:

  • Delayed_paperclip 2.9.1
  • Mongoid 4.0.2
  • Mongoid-Paperclip 0.0.9
  • Paperclip 4.2.1
  • Скрепка-ау-транскодер 0,6. 4
  • Рельсы 4.1.9
  • Sidekiq 3.5.0

ответ

1

Я искал код delayed_paperclip и определенно привязан к ActiveRecord, поэтому не совместим с Mongoid. Я попробовал mongoid_paperclip_queue, но этот драгоценный камень не обновлялся через 4 года и, похоже, не работает с текущими версиями rails/mongoid/paperclip, насколько я могу судить.

Поэтому я решил, что лучший способ решить мою проблему - переопределить код delayed_paperclip, который интегрируется с ActiveRecord и вместо этого работать с Mongoid.

Это то, что я в конечном итоге делает, и, кажется, работает нормально до сих пор:

lib/myengine.rb

require "mongoid_paperclip" 
require "paperclip/av/transcoder" 
require "delayed_paperclip" 
require "myengine/engine" 

module Myengine 
end 

DelayedPaperclip::Railtie.class_eval do 

    initializer 'delayed_paperclip.insert_into_mongoid' do |app| 
    ActiveSupport.on_load :mongoid do 
     DelayedPaperclip::Railtie.insert 
    end 

    if app.config.respond_to?(:delayed_paperclip_defaults) 
     DelayedPaperclip.options.merge!(app.config.delayed_paperclip_defaults) 
    end 
    end 

    # Attachment and URL Generator extends Paperclip 
    def self.insert 
    Paperclip::Attachment.send(:include, DelayedPaperclip::Attachment) 
    Paperclip::UrlGenerator.send(:include, DelayedPaperclip::UrlGenerator) 
    end 
end 

DelayedPaperclip::InstanceMethods.class_eval do 

    def enqueue_post_processing_for name 
    DelayedPaperclip.enqueue(self.class.name, read_attribute(:id).to_s, name.to_sym) 
    end 
end 

Тогда все, что вам нужно, это включить delayed_paperclip клей на модель:

module Myengine 
    class Video 
    include Mongoid::Document 
    include Mongoid::Paperclip 
    include DelayedPaperclip::Glue  # <---- Include this 

    has_mongoid_attached_file :file, 
     :path => ':hash.:extension', 
     :hash_secret => "the-secret", 
     :storage => :s3, 
     :url => ':s3_domain_url', 
     :s3_credentials => File.join(Rails.root, 'config', 's3.yml'), 
     :bucket => "my-bucket-#{Rails.env}", 
     :styles => { 
     :mp4 => { :format => 'mp4', :convert_options => { :output => { :vcodec => 'libx264', :acodec => 'copy' } } }, 
     :ogg => { :format => 'ogg', :auto_rotate => true }, 
     :webm => { :format => 'webm', :auto_rotate => true }, 
     :thumb => { :geometry => "250x187#", :format => 'jpg', :time => 10, :auto_rotate => true } 
     }, 
     :processors => [:transcoder] 

    validates_attachment :file, :content_type => { :content_type => ["video/x-flv", "video/mp4", "video/ogg", "video/webm", "video/x-ms-wmv", "video/x-msvideo", "video/quicktime", "video/3gpp"] } 

    process_in_background :file 
    end 
end 

Надеюсь, это спасет кого-то еще от этой проблемы.

+0

Хорошо, что вы вернулись и ответили на свой вопрос так подробно. –

 Смежные вопросы

  • Нет связанных вопросов^_^