1

写真やビデオのユーザー アップロードを処理する Rails 4.1 エンジンに取り組んでいます。Mongoid-Paperclip を使用してアップロードを処理し、Paperclip-av-transcoder を使用してビデオをいくつかの形式にエンコードしています。すべてのファイルは S3 に保存されます。これらはすべて正常に機能しますが、予想どおり、ビデオのエンコードにはかなりの時間がかかる可能性があるため、次のステップはバックグラウンドでエンコードを行うことです。グーグルで調べたところ、 Delayed_Paperclipが必要な機能を果たしているように見えました。その後、Sidekiqがバックグラウンド処理を処理するための最良の選択肢であると思われました。

問題は、これらすべてを一緒に機能させることができないということです。単体テストを実行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_pa​​perclip 2.9.1
  • モンゴイド 4.0.2
  • Mongoid-ペーパークリップ 0.0.9
  • ペーパークリップ 4.2.1
  • Paperclip-av-トランスコーダー 0.6.4
  • レール 4.1.9
  • サイドキク 3.5.0
4

1 に答える 1

1

私はdelayed_pa​​perclipのコードを掘り下げてきましたが、それは間違いなくActiveRecordに関連付けられているため、Mongoidとは互換性がありません. 私はmongoid_paperclip_queueを試してみましたが、その宝石は 4 年間更新されておらず、現在のバージョンの rails/mongoid/paperclip では動作しないようです。

したがって、私の問題を解決する最善の方法は、ActiveRecord と統合されているdelayed_pa​​perclip のコードをオーバーライドし、代わりに 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_pa​​perclip グルーをモデルに含めるだけです。

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

うまくいけば、これが他の誰かのすべての問題を救うでしょう。

于 2015-09-14T17:11:42.890 に答える