# application.css #barcode-scanner canvas.drawingBuffer, #barcode-scanner video.drawingBuffer { display: none; } #barcode-scanner canvas, #barcode-scanner video { width: 100%; height: auto; }





# application.js //= require quagga //= require_tree . function order_by_occurrence(arr) { var counts = {}; arr.forEach(function(value){ if(!counts[value]) { counts[value] = 0; } counts[value]++; }); return Object.keys(counts).sort(function(curKey,nextKey) { return counts[curKey] < counts[nextKey]; }); } function load_quagga(){ if ($('#barcode-scanner').length > 0 && navigator.mediaDevices && typeof navigator.mediaDevices.getUserMedia === 'function') { var last_result = []; if (Quagga.initialized == undefined) { Quagga.onDetected(function(result) { var last_code = result.codeResult.code; last_result.push(last_code); if (last_result.length > 20) { code = order_by_occurrence(last_result)[0]; last_result = []; Quagga.stop(); $.ajax({ type: "POST", url: '/products/get_barcode', data: { upc: code } }); } }); } Quagga.init({ inputStream : { name : "Live", type : "LiveStream", numOfWorkers: navigator.hardwareConcurrency, target: document.querySelector('#barcode-scanner') }, decoder: { readers : ['ean_reader','ean_8_reader','code_39_reader','code_39_vin_reader','codabar_reader','upc_reader','upc_e_reader'] } },function(err) { if (err) { console.log(err); return } Quagga.initialized = true; Quagga.start(); }); } }; $(document).on('turbolinks:load', load_quagga);





# visitors/index.html.erb <div id='barcode-scanner'></div>





# routes.rb Rails.application.routes.draw do resources :products do post :get_barcode, on: :collection end root 'visitors#index' # rake routes # Prefix Verb URI Pattern Controller#Action # get_barcode_products POST /products/get_barcode(.:format) products#get_barcode # products GET /products(.:format) products#index # POST /products(.:format) products#create # new_product GET /products/new(.:format) products#new # edit_product GET /products/:id/edit(.:format) products#edit # product GET /products/:id(.:format) products#show # PATCH /products/:id(.:format) products#update # PUT /products/:id(.:format) products#update # DELETE /products/:id(.:format) products#destroy # root GET / visitors#index end





# products_controller.rb # GET /products/new def new @product = Product.new @product.upc = params[:upc] end ... # POST /products/get_barcode def get_barcode @product = Product.find_or_initialize_by(upc: params[:upc]) unless @product.new_record? redirect_to @product else redirect_to new_product_path(upc: params[:upc]) end end