Forum: Rails-ES Utilizar funcion Create para almacenar un objeto en la BD

Posted by Chango Martinez (chango)
on 2009-06-30 03:22
Hola a todos, bueno, soy nuevo en esto de ruby, sucede que con unos
amigos venimos trabajando en un sistema, dado que eramos nuevos en
rails, no usabamos el scafold, pues no sabiamos como, sin embargo en el
mantenimiento de mis usuarios de sistema, decidi usar las bondades de
automatizacion que brinda rails, y estoy perdido, para empezar tengo una
vista, con un form como el que sigue:

<%form_tag (:action=> "insert") do%> </th>

   <tr>
    <td colspan="2"><div align="center" class="Estilo9">Administracion
de Usuarios del Sistema </div></td>
    <td>&nbsp;</td>
  </tr>

  <tr>
    <td>&nbsp;</td>
    <td width="24%"><span class="Estilo7 Estilo3"><strong>Nombre del
Usuario : </strong></span></td>
    <td width="27%"><span class="Estilo3"><span class="Estilo22">
    <%= text_field "formUser", "usuario", :id =>"usuario", :style =>
"background-color:#fafad2",:size => 30%></span>&nbsp;</span></td>
    <td>&nbsp;</td>
  </tr>

  <tr>
    <td>&nbsp;</td>
    <td><span class="Estilo7
Estilo3"><strong>Contrasena:</strong></span></td>
    <td><span class="Estilo3"><span class="Estilo22"><%= text_field
"formUser", "contrasena", :id =>"contrasena", :style =>
"background-color:#fafad2",:size => 30%></span></span></td>
    <td>&nbsp;</td>
  </tr>

  <tr>
    <td>&nbsp;</td>
    <td><span class="Estilo8">Codigo: </span></td>
    <td><span class="Estilo22"><%= text_field "formUser", "codigo", :id
=>"codigo", :style => "background-color:#fafad2",:size => 30
%></span></td>
    <td>&nbsp;</td>
  </tr>

  <tr>
    <td>&nbsp;</td>
    <td><span class="Estilo7 Estilo3"><strong>Rol: </strong></span></td>
    <td><span class="Estilo3"><%= select_tag
"ccodrol",options_for_select(@polroles)%></span></td>
    <td>&nbsp;</td>
  </tr>

  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>

  <tr>
    <td>&nbsp;</td>
    <td align="RIGHT"><%= submit_tag  "   Grabar    "  %></td>
    <td>        <%= submit_tag  "  Cancelar  "  %></td>
    <td>        <%end %>




ES la idea basica del form que me llama a mi funcion controladora insert
el punto es que en el insert, no se como almacenar los dato en la base,
siempre me vota error:

esa es mi funcion insert

def insert
    @polroles = recupera_roles
    @operacion = 'Nuevo'
    @var = params[:msj]
    flash[:message] = params[:msj]
    if request.post?
     case params[:commit]
              when "   Grabar    "
                 save()
              when "  Cancelar  "
                 @var = 'PROCESO CANCELADO'
                flash[:message] = @var
         end
     end
    render :layout =>  'vistaadminmto'
  end

Esa es mi funcion save

 def save
    @user = User.new

    if (create)
       @mensaje = "Articulo Grabado Con Exito"
     else
        @mensaje = "Articulo Grabado Sin Exito"
      end
     redirect_to :action => 'insert', :msj => @mensaje.upcase
  end

Y bueno, mi funcion Create q no funciona es esta

 def create
    if (@user.create(:username => params[:formUser][:usuario],
             :hashed_password =>   params[:formUser][:usuario],
             :ccodtra => params[:formUser][:codigo],
             :ccodrol => params[:ccodrol]))
         return true;
    end
    return false
  end


Espero alguien me pueda ayudar, se que el codigo es desordenado, y q no
es lo optimo pero al menos me gustaria que funcione. Gracias de Antemano
Posted by Andrés Gutiérrez (andresgutgon)
on 2009-06-30 09:41
(Received via mailing list)
Lee unos cuantos de estos [1]. Lo han explicado muy bien. Al menos las 
cosas
básicas, que es lo que estas preguntando aquí.

[1] http://guides.rubyonrails.org/

El 30 de junio de 2009 03:22, Edwin Martinez <
ruby-forum-incoming@andreas-s.net> escribió:
Posted by Manuel González Noriega (Guest)
on 2009-06-30 10:59
(Received via mailing list)
2009/6/30 Edwin Martinez <ruby-forum-incoming@andreas-s.net>

> Hola a todos, bueno, soy nuevo en esto de ruby, sucede que con unos
> amigos venimos trabajando en un sistema, dado que eramos nuevos en
> rails, no usabamos el scafold, pues no sabiamos como, sin embargo en el
> mantenimiento de mis usuarios de sistema, decidi usar las bondades de
> automatizacion que brinda rails, y estoy perdido, para empezar tengo una
> vista, con un form como el que sigue:
>  <http://lists.simplelogica.net/mailman/listinfo/ror-es>



Hola Edwin,

por favor, por tu propio bien, consigue una buena fuente de información
(bien online o bien alguno de los libros publicados) para dar tus 
primeros
pasos en Rails. Te será de mucha ayuda a la hora de comprender los 
aspectos
más básicos del desarrollo.

Por ejemplo, el recurso que te da Andrés está enlazado desde la misma 
página
de Rails, así que podrías ya haberlo encontrado por ti mismo.

Un saludo
Posted by Chango Martinez (chango)
on 2009-07-07 05:47
En efecto, tienen razon, estoy mas informado del tema ahora, he hecho 
varias aplicaciones de prueba, y ya entiendo mas el funcionamiento de 
los helper, y las cosas basicas de las aplicaciones CRUD, sin embargo 
hay algo que aun no entiendo.

Cuando creo un objeto en base al modelo, con la funcion NEW, me doy 
cuenta que no me jala el atributo correspondiente a la primary key, 
entonces, cuando lo grabo con la funcion SAVE, no lo hace porque me 
indica que en la base de datos no se puede obviamente omitir la primary 
key, como puedo corregir este problema?

Gracias
Posted by Jose vicente Ribera pellicer (joripel)
on 2009-07-07 19:03
Chango Martinez wrote:
> 
> En efecto, tienen razon, estoy mas informado del tema ahora, he hecho 
> varias aplicaciones de prueba, y ya entiendo mas el funcionamiento de 
> los helper, y las cosas basicas de las aplicaciones CRUD, sin embargo 
> hay algo que aun no entiendo.
> 
> Cuando creo un objeto en base al modelo, con la funcion NEW, me doy 
> cuenta que no me jala el atributo correspondiente a la primary key, 
> entonces, cuando lo grabo con la funcion SAVE, no lo hace porque me 
> indica que en la base de datos no se puede obviamente omitir la primary 
> key, como puedo corregir este problema?
> 
> Gracias

No se si te refieres a que algun campo no te se rellena cuando haces el
new y por eso te da error al salvar.
Cuando haces el new puedes ir rellenando todos los valores del registro:

registro= Nombre_tabla.new(:campo1 => 'hola', :campo2=>'que',
:campo3=>'tal).save

Así ya creas un registro en la nueva tabla y lo guardas.
Recuerda que puedes actualizar el registro con las funciones
update_attribute y update_attributes.

s2
Posted by Chango Martinez (chango)
on 2009-07-08 05:08
Gracias por la ayuda Jose, el punto es que no puedo acceder a mi 
atributo PK,
me explico, Tengo un objeto User, el cual almacena mis usuarios de 
sistema, al momento de hacer User.new, me crea un objeto con los mismos 
atributos a la base de datos menos el que es PK, es decir, puedo llenar 
user1.username , user1.hash_password, o los que tuviese, pero no puedo 
acceder a user1.id;
ahora cuando quiero grabar es decir user1.save me sale logicamente que 
no se puede pues el campo PK es decir id, esta vacio.

Como puedo hacer para que al crear el objeto me incluya el atributo que 
es PK en la tabla?.




Jose vicente Ribera pellicer wrote:
> Chango Martinez wrote:
>> 
>> En efecto, tienen razon, estoy mas informado del tema ahora, he hecho 
>> varias aplicaciones de prueba, y ya entiendo mas el funcionamiento de 
>> los helper, y las cosas basicas de las aplicaciones CRUD, sin embargo 
>> hay algo que aun no entiendo.
>> 
>> Cuando creo un objeto en base al modelo, con la funcion NEW, me doy 
>> cuenta que no me jala el atributo correspondiente a la primary key, 
>> entonces, cuando lo grabo con la funcion SAVE, no lo hace porque me 
>> indica que en la base de datos no se puede obviamente omitir la primary 
>> key, como puedo corregir este problema?
>> 
>> Gracias
> 
> No se si te refieres a que algun campo no te se rellena cuando haces el
> new y por eso te da error al salvar.
> Cuando haces el new puedes ir rellenando todos los valores del registro:
> 
> registro= Nombre_tabla.new(:campo1 => 'hola', :campo2=>'que',
> :campo3=>'tal).save
> 
> Así ya creas un registro en la nueva tabla y lo guardas.
> Recuerda que puedes actualizar el registro con las funciones
> update_attribute y update_attributes.
> 
> s2
Posted by Jose vicente Ribera pellicer (joripel)
on 2009-07-08 13:17
Chango Martinez wrote:
> Gracias por la ayuda Jose, el punto es que no puedo acceder a mi 
> atributo PK,
> me explico, Tengo un objeto User, el cual almacena mis usuarios de 
> sistema, al momento de hacer User.new, me crea un objeto con los mismos 
> atributos a la base de datos menos el que es PK, es decir, puedo llenar 
> user1.username , user1.hash_password, o los que tuviese, pero no puedo 
> acceder a user1.id;
> ahora cuando quiero grabar es decir user1.save me sale logicamente que 
> no se puede pues el campo PK es decir id, esta vacio.
> 
> Como puedo hacer para que al crear el objeto me incluya el atributo que 
> es PK en la tabla?.
> 
> 


Y para que necesitas entonces el campo PK? Lo digo porque cuando creas 
un usuario el campo id se genera automaticamente (igual que el 
created_at y el updated_at).Algo raro estas haciendo con el id, si lo 
usas por algun tipo de relacion entre tablas te aconsejo que mires 
alguno de los muchisimos tutoriales de relaciones entre tablas que 
puedes encontrar en la web. Lo siento pero asi a primeras no se decirte 
nada mas.
Posted by Chango Martinez (chango)
on 2009-07-15 08:25
Hola  a todos de nuevo:

Como me decian al principio, me enfrasque en la lectura de las guias
basicas, decidi dejar por el momento mi problema con los usuarios, y
decidi hacer otro modulo, eso si, usando todas las formas estandares
posibles, sin ir muy lejos use el scaffold, aqui creo la cabecera de un
"kid_de articulos"

ruby script/generate scaffold c01mkid cdescripcion:string nprecio:float
nprecio_real:float cestado:string cusuario_mod:integer


Me genero todo lo basico que necesitaba, despues, modifique el archivo
de migracion a mi guste, asi lo cambie:

  class CreateC01mkids < ActiveRecord::Migration
    def self.up
      create_table :c01mkids , :primary_key => :id_kid do |t|
        t.string :cdescripcion
        t.column :nprecio, 'numeric(12,2)',:null => false
        t.column :nprecio_real, 'numeric(12,2)',:null => false
        t.column :cestado, 'character(1)',:null => false
        t.integer :cusuario_mod

        t.timestamps
      end
    end

    def self.down
      drop_table :c01mkids
    end
  end

Ejecute la migracion con exito, usando el rake -->
     rake db:migrate:up VERSION=20090715030104

Hasta ahi todo bien, uso la base de datos en postgres y me creo una
tabla con esta descripcion


CREATE TABLE c01mkids
(
  id_kid serial NOT NULL,
  cdescripcion character varying(255) DEFAULT NULL::character varying,
  nprecio numeric(12,2) NOT NULL,
  nprecio_real numeric(12,2) NOT NULL,
  cestado character(1) NOT NULL,
  cusuario_mod integer,
  created_at timestamp without time zone,
  updated_at timestamp without time zone,
  CONSTRAINT c01mkids_pkey PRIMARY KEY (id_kid)
)
WITH (OIDS=FALSE);
ALTER TABLE c01mkids OWNER TO postgres;


Algo que me llamo la atencion fue que me creo una secuencia,
para el id, lo cual me pareci perfecto. De hecho probe agregar unos
registros a la base de datos desde el pdAdmin, y todo excelente, me
autogeneraba el id_kid.


MI PROBLEMA VIENE AL TRATAR DE CREAR UN nuevo registro desde la vista
que automaticamente me genero.

me arroja el siguiente error

PGError: ERROR:  null value in column "id_kid" violates not-null
constraint
: INSERT INTO "c01mkids" ("updated_at", "id_kid", "nprecio",
"cusuario_mod", "nprecio_real", "cestado", "cdescripcion", "created_at")
VALUES('2009-07-15 06:20:19.049000', NULL, 23.3, 1, 21.2, E'A', E'Kid de
navidad', '2009-07-15 06:20:19.049000')


Y efectivamente es logico, pero vuelvo al mismo problema que tenia con
los usuarios, no puedo Grabar porque no mando un id, porque me sucede
esto?, sera el gem que uso para el pstgres, por cierto el gem que uso es
ruby-postgres (que por cierto no me permite actualizar, me da un erro de
acceso), alguien me puede dar una pista, espero que si, y gracias de
antemano.
















Jose vicente Ribera pellicer wrote:
> Chango Martinez wrote:
>> Gracias por la ayuda Jose, el punto es que no puedo acceder a mi 
>> atributo PK,
>> me explico, Tengo un objeto User, el cual almacena mis usuarios de 
>> sistema, al momento de hacer User.new, me crea un objeto con los mismos 
>> atributos a la base de datos menos el que es PK, es decir, puedo llenar 
>> user1.username , user1.hash_password, o los que tuviese, pero no puedo 
>> acceder a user1.id;
>> ahora cuando quiero grabar es decir user1.save me sale logicamente que 
>> no se puede pues el campo PK es decir id, esta vacio.
>> 
>> Como puedo hacer para que al crear el objeto me incluya el atributo que 
>> es PK en la tabla?.
>> 
>> 
> 
> 
> Y para que necesitas entonces el campo PK? Lo digo porque cuando creas 
> un usuario el campo id se genera automaticamente (igual que el 
> created_at y el updated_at).Algo raro estas haciendo con el id, si lo 
> usas por algun tipo de relacion entre tablas te aconsejo que mires 
> alguno de los muchisimos tutoriales de relaciones entre tablas que 
> puedes encontrar en la web. Lo siento pero asi a primeras no se decirte 
> nada mas.
Posted by Chango Martinez (chango)
on 2009-07-16 06:37
Bueno, solo con el objetivo de ayudar a alguien que pase por el mismo
problema, para un novato como yo para ser exactos :P, sucede que rails
crea por convencion todos los primary_key de las tablas con ese nombre
id, si se quiere modificar el nombre se tiene que especificar en el
modelo, en mi caso seria algo como esto:

class C01mkid < ActiveRecord::Base
  set_primary_key "id_kid"
end


Bueno, eso es todo Adios.



Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.