Carrierwave gryzie się z Sidekiq

Witam

Carrierwave używam do uploadu plików innych niż grafiki (np. *.m). Wszystko było spoko dopóki cześć pracy z klasy (niezależnej od CW) wydzieliłem do workera sidekiqa.

Przepraszam za brak wcięć po wklejeniu. Jeśli może mi poradzić jak to naprawić to to zrobię.

Pełen stacktrace błedu z Sidekiq-a

2016-07-16T08:52:57.772Z 3700 TID-7zl70 ImagesWorker JID-229dedebb6aacb878053c5e8 INFO: start
2016-07-16T08:52:58.005Z 3700 TID-7zl70 ImagesWorker JID-229dedebb6aacb878053c5e8 INFO: fail: 0.232 sec
2016-07-16T08:52:58.005Z 3700 TID-7zl70 WARN: {"class":"ImagesWorker","args":[80,0],"retry":false,"queue":"default","jid":"229dedebb6aacb878053c5e8","created_at":1468659177.7670429,"enqueued_at":1468659177.7674544}
2016-07-16T08:52:58.005Z 3700 TID-7zl70 WARN: NoMethodError: undefined method `remove_previously_stored_files_after_update' for nil:NilClass
2016-07-16T08:52:58.005Z 3700 TID-7zl70 WARN: /home/emes0/.rvm/gems/ruby-2.2.3/gems/carrierwave-0.11.2/lib/carrierwave/mount.rb:233:in `store_previous_model_for_script_files'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:432:in `block in make_lambda'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:164:in `call'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:164:in `block in halting'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:504:in `call'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:504:in `block in call'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:504:in `each'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:504:in `call'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:92:in `__run_callbacks__'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:778:in `_run_update_callbacks'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/callbacks.rb:310:in `_update_record'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/timestamp.rb:70:in `_update_record'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/persistence.rb:504:in `create_or_update'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/callbacks.rb:302:in `block in create_or_update'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:117:in `call'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:117:in `call'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:555:in `block (2 levels) in compile'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:505:in `call'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:505:in `call'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:92:in `__run_callbacks__'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/callbacks.rb:778:in `_run_save_callbacks'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/callbacks.rb:302:in `create_or_update'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/persistence.rb:120:in `save'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/validations.rb:37:in `save'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/attribute_methods/dirty.rb:21:in `save'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/transactions.rb:286:in `block (2 levels) in save'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/transactions.rb:351:in `block in with_transaction_returning_status'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `block in transaction'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/transaction.rb:184:in `within_new_transaction'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `transaction'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/transactions.rb:220:in `transaction'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/transactions.rb:348:in `with_transaction_returning_status'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/transactions.rb:286:in `block in save'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/transactions.rb:301:in `rollback_active_record_state!'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.5/lib/active_record/transactions.rb:285:in `save'
/home/emes0/RubymineProjects/dckr/app/workers/images_worker.rb:52:in `perform'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:152:in `execute_job'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:134:in `block (2 levels) in process'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:128:in `block in invoke'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/middleware/server/active_record.rb:6:in `call'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/middleware/server/retry_jobs.rb:74:in `call'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/middleware/server/logging.rb:11:in `block in call'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/logging.rb:32:in `with_context'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/middleware/server/logging.rb:7:in `call'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:133:in `call'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:133:in `invoke'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:129:in `block in process'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:168:in `stats'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:128:in `process'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:80:in `process_one'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:68:in `run'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/util.rb:17:in `watchdog'
/home/emes0/.rvm/gems/ruby-2.2.3/gems/sidekiq-4.1.4/lib/sidekiq/util.rb:25:in `block in safe_thread'

controllers/images_controller.rb

class ImagesController < ApplicationController
  require 'carrierwave/orm/activerecord'

  before_action :set_image, only: [:show, :edit, :update, :destroy]
  
  def index
    @images = Image.where(user_id: current_user).order('created_at DESC')
  end

  def show
  end

  def new
    @image = current_user.images.build
  end

  def edit
  end

  def create
    @image = current_user.images.build(image_params)

    uploader = ScriptFilesUploader.new
    uploader.store!(params[:script_files])

    respond_to do |format|
      if @image.save
        format.html { redirect_to @image, notice: 'Image was successfully created.' }
        format.json { render :show, status: :created, location: @image }
        ImagesWorker.perform_async(@image.id)
      else
        format.html { render :new }
        format.json { render json: @image.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @image.update(image_params)
        format.html { redirect_to @image, notice: 'Image was successfully updated.' }
        format.json { render :show, status: :ok, location: @image }
      else
        format.html { render :edit }
        format.json { render json: @image.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @image.destroy
    respond_to do |format|
      format.html { redirect_to images_url, notice: 'Image was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_image
      @image = Image.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def image_params
      params.require(:image).permit(:name, :description, :script_files)
    end
end

views/images/_form.html.haml

= simple_form_for(@image) do |f|
	= f.error_notification
	.form-inputs
		= f.input :name
		= f.input :description
		= f.file_field :script_files, class: 'file_field'
	.form-actions
		= f.button :submit, class: 'button'

models/image.rb

    class Image < ActiveRecord::Base
      mount_uploader :script_files, ScriptFilesUploader
      attr_accessor :script_files, :remote_script_files_url, :script_files_cache, :remove_script_files
      
      belongs_to :user
      has_many :containers, inverse_of: :image
      validates :name, :description, presence: true
    end

workers/image_workers.rb

class ImagesWorker
	include Sidekiq::Worker
	sidekiq_options retry: false
	require 'docker'

	def perform(image_id, docker_choice)
		@image = Image.find(image_id)
		@dockerfile_choice = []

		Excon.defaults[:write_timeout] = 7200
		Excon.defaults[:read_timeout] = 7200
		Docker.options[:read_timeout] = 7200
		Docker.options[:write_timeout] = 7200

		@dockerfile_choice[0] = "FROM ubuntu:14.04
										RUN apt-get -y update && apt-get install -y software-properties-common
										RUN apt-get -y update && apt-get autoremove"

		@dockerfile_choice[1] = "FROM ubuntu:14.04
										RUN apt-get -y update && apt-get install -y software-properties-common
										RUN add-apt-repository -y ppa:fenics-packages/fenics
										RUN apt-get install -y fenics
										RUN apt-get -y update && apt-get autoremove
										RUN apt-get install -y python-numpy
										RUN apt-get install -y dolphin
										RUN apt-get install -y python-scipy
										RUN apt-get install -y python-matplotlib
										RUN apt-get -y update && apt-get autoremove"
										# ENV foo #{uploader.path}
										# COPY .$foo /home/"

		@dockerfile_choice[2] = "FROM ubuntu:14.04
										RUN apt-get -y update && apt-get install -y software-properties-common
										RUN add-apt-repository -y ppa:octave/stable
										RUN apt-get update && apt-get install -y octave
										RUN apt-get install -y epstool
										RUN apt-get install -y gnuplot
										RUN apt-get install -y octave-signal
										RUN apt-get install -y transfig
										RUN apt-get -y update && apt-get autoremove"

		dockerfile_my = @dockerfile_choice[docker_choice]

		image = Docker::Image.build(dockerfile_my)
		@image.DockerImageID = image.id
		image.tag('repo' => 'docker_app', 'tag' => @image.name.to_s, force: true)

		@image.save
	end
end

Kod wrzuć pomiędzy ``` a ```. Wrzuć także kod workera oraz najważniejsze pełen stacktrace błędu.
Dodatkowo poszukaj w google bo jest sporo wyników z podobnym błędów do Twojego…

Dzięki za odpowiedź :slight_smile:

Dodałem pełen stacktrace i workera. Przed wrzuceniem postu na forum guglałem rozwiązania i trafiłem na podobne materiały jak mi podesłałeś. Niestety żaden z nich mi nie pomógł.

Na moje oko to niepotrzebnie dodałeś accessory. One są automatyczne generowane przez carrierwave. Usuń całą linijkę:

      attr_accessor :script_files, :remote_script_files_url, :script_files_cache, :remove_script_files