Utilizar funcion Create para almacenar un objeto en la BD

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%>

Administracion de Usuarios del Sistema
    Nombre del Usuario : <%= text_field "formUser", "usuario", :id =>"usuario", :style => "background-color:#fafad2",:size => 30%>      Contrasena: <%= text_field "formUser", "contrasena", :id =>"contrasena", :style => "background-color:#fafad2",:size => 30%>     Codigo: <%= text_field "formUser", "codigo", :id =>"codigo", :style => "background-color:#fafad2",:size => 30 %>     Rol: <%= select_tag "ccodrol",options_for_select(@polroles)%>             <%= submit_tag " Grabar " %> <%= submit_tag " Cancelar " %> <%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

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 M. <
[email protected]> escribió:

2009/6/30 Edwin M. [email protected]

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

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

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

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

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.

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.

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.