Insert several records through create action

6 views
Skip to first unread message

Jaime Gonzalez.

unread,
Feb 25, 2013, 6:46:08 PM2/25/13
to tiju...@googlegroups.com
Hola a todos, espero se encuentren muy bien.

Estoy trabajando en un Rails app que genera tarjetas kanban para la compania donde trabajo, de igual manera debe generar archivos .jpg que contienen los codigos de barras utilizando un gem llamado Image Magick y otro llamado Barby.

Tengo un problema con mi metodo actual, le agregue un ciclo para insertar los registros en base a un contador, pero obtengo un ciclo infinito.

Anexo el codigo, alguna idea cual es el best practice para insertar registros de esta manera?

De antemano muchas gracias, saludos a todos.

Jaime.


#require 'rubygems'
require 'barby'
require 'barby/barcode/code_39'
require 'barby/outputter/rmagick_outputter'

#Extension to include barcode data below the image
module Barby
  class CustomRmagickOutputter < RmagickOutputter
    register :to_image_with_data
    def to_image_with_data
      #Make canvas  bigger
      canvas = Magick::ImageList.new
      canvas.new_image(full_width , full_height + 10)
      canvas << to_image
      canvas = canvas.flatten_images
      #Make the text
      text = Magick::Draw.new
      text.font_family = 'helvetica'
      text.pointsize = 14
      text.gravity = Magick::SouthGravity
      text.annotate(canvas , 0,0,0,0, barcode.data)
      canvas
    end
  end
end

class CardController < ApplicationController
  def new
    @card = Card.new
  end
  
  def create 
    @card = Card.create(params[:card])
    finish = @card.finish
    @card.start = 2
    until @card.start > finish
      @card.start += 1
      @card = Card.create(params[:card])
      file_name = @card.barcode 
      barcode = Barby::Code39.new(file_name)
      barcode.to_image_with_data.write("app/assets/barcodes/#{file_name}.png")
    end
    if @card.save
      redirect_to(:action => 'lookup')
    else
      render('new')
    end
    
  end
  
  def lookup
    @cards = Card.all
  end
  
  def print
    @card = Card.find(params[:id])
  end

  def edit
    @card = Card.find(params[:id])
  end

  def update
    @card = Card.find(params[:id])
    if @card.update_attributes(params[:card])
      redirect_to(:action => 'lookup')
    else
      render('edit')
    end
  end

  def delete
    @card = Card.find(params[:id])
  end

  def destroy
    Card.find(params[:id]).destroy
    redirect_to(:action => 'lookup')
  end

end

Antonio Antillon

unread,
Feb 26, 2013, 2:32:33 AM2/26/13
to tiju...@googlegroups.com
Jaime,

No sé muy bien cuál se supone es el flujo de la creación de la tarjeta... pero creo que tu conflicto está aquí:


until @card.start > finish
      @card.start += 1
      @card = Card.create(params[:card])
      file_name = @card.barcode 
      barcode = Barby::Code39.new(file_name)
      barcode.to_image_with_data.write("app/assets/barcodes/#{file_name}.png")
end

Antes de entrar a ese loop, tienes una tarjeta recién creada en la variable @card.
Ahora, cuando entras al loop para decirle que hasta que el atributo :start de @card sea mayor a la variable finish, incrementa el valor de start en 1, luego vuelve a crear una tarjeta con los mismo parámetros, lo que dentro de ese loop, dispara este mismo loop para la nueva tarjeta creada, y así sucesivamente.

Espero que esto ayude.

Saludos,
Antonio


--
You received this message because you are subscribed to the Google Groups "tijuanarb" group.
To unsubscribe from this group and stop receiving emails from it, send an email to tijuanarb+...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

Jaime Gonzalez.

unread,
Feb 26, 2013, 10:21:23 AM2/26/13
to tiju...@googlegroups.com
Hola Antonio, muchas gracias por la respuesta.

Si, ese loop era mi problema, pero despues me di cuenta que no debia insertar los registros en la base de datos, solo uno por tarjeta es necesario, y despues en la vista donde imprimo las tarjetas genero las necesarias en base al valor de finish.

Ahora mi controller es correcto:

def create
    @card = Card.create(params[:card])
    start = @card.start
    finish = @card.finish
    finish.times do
      file_name = @card.part_no + "-" + start.to_s + "-" + finish.to_s
      barcode = Barby::Code39.new(file_name)
      barcode.to_image_with_data.write("app/assets/barcodes/#{file_name}.png")
      start += 1
    end
    if @card.save
      redirect_to(:action => 'lookup')
    else
      render('new')
    end
    
  end

Muchas gracias de nuevo por el apoyo.

Saludos.

Jaime.
--
Jaime Gonzalez.
Reply all
Reply to author
Forward
0 new messages