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