Ruby Forum Rails-ES > error de dato incorrecto

Posted by Mauro Cosatto (mcosatto)
on 12.08.2008 22:05
Buenas, tengo una web y estoy intentando hacer que funcione como se
debe, en una de las paginas, en la que doy de alta nuevos proyectos
tengo un campo para completar que es el de la priorida, el mismo es un
combo que va de 1 a 5, que son los valores permitidos.
Lo que ocurre es que selecciono un valor y doy guardar y me tira el
siguiente error:
---------------------------------------------------------------------
1 error prohibited this item from being saved

There were problems with the following fields:

    * Priority must be between 1 (high) and 5 (low)
---------------------------------------------------------------------
Lo cual me llama la atencion ya que los valores que figuran en el
desplegable son solo los permitidos
---------------------------------------------------------------------
<td><%= select "item","priority",[1,2,3,4,5] %></td>
---------------------------------------------------------------------
La validacion que hago es la siguiente:
---------------------------------------------------------------------
validates_inclusion_of :priority, :in=>1..5, :message=>"must be between
1 (high) and 5 (low)"
---------------------------------------------------------------------

Desde ya muchas gracias

Mauro
Posted by Juan Pablo (Guest)
on 12.08.2008 22:12
(Received via mailing list)
Que te muestra el log?

2008/8/12 Mauro Cosatto <ruby-forum-incoming@andreas-s.net>
Posted by Mauro Cosatto (mcosatto)
on 12.08.2008 23:12
Juan Pablo wrote:
> Que te muestra el log?
> 
> 2008/8/12 Mauro Cosatto <ruby-forum-incoming@andreas-s.net>
---------------------------------------------------------------------------------
Processing ItemsController#create (for 127.0.0.1 at 2008-08-12 17:56:57) 
[POST]
  Session ID: 07c5ce2e0e29af9099fc6f2311738cd0
  Parameters: {"commit"=>"Guardar", "action"=>"create", 
"controller"=>"items", "item"=>{"due_date(1i)"=>"2008", "done"=>"0", 
"due_date(2i)"=>"10", "private"=>"0", "due_date(3i)"=>"12", 
"priority"=>"2", "category_id"=>"17", "description"=>"Proyecto 
Prioridad"}}
DEPRECATION WARNING: @params is deprecated! Call params.[] instead of 
@params.[]. Args: [:item]  See http://www.rubyonrails.org/deprecation 
for details. (called from create at 
c:/ror/todo/public/../config/../app/controllers/items_controller.rb:75)
  SQL (0.000000)   SET SQL_AUTO_IS_NULL=0
  Item Columns (0.010000)   SHOW FIELDS FROM items
  SQL (0.000000)   BEGIN
  Category Columns (0.020000)   SHOW FIELDS FROM 
categories
  Category Load (0.010000)   SELECT * FROM categories 
WHERE (categories.`id` = 17) 
  Category Load (0.000000)   SELECT * FROM categories 
WHERE (categories.category = 'Cliente 10' AND categories.id <> 17) LIMIT 
1
  SQL (0.000000)   COMMIT
DEPRECATION WARNING: find_all is deprecated and will be removed from 
Rails 2.0 (use find(:all, ...))  See 
http://www.rubyonrails.org/deprecation for details. (called from create 
at 
c:/ror/todo/public/../config/../app/controllers/items_controller.rb:80)
  Category Load (0.000000)   SELECT * FROM categories 

Rendering layoutfalsefileitems/newuse_full_pathtruestatus within 
layouts/application
Rendering items/new
DEPRECATION WARNING: start_form_tag is deprecated and will be removed 
from Rails 2.0 (use form_tag instead)  See 
http://www.rubyonrails.org/deprecation for details. (called from 
_run_rhtml_47app47views47items47new46rhtml at 
c:/ror/todo/public/../config/../app/views/items/new.rhtml:3)
Rendered items/_form (0.04000)
DEPRECATION WARNING: end_form_tag is deprecated and will be removed from 
Rails 2.0  See http://www.rubyonrails.org/deprecation for details. 
(called from _run_rhtml_47app47views47items47new46rhtml at 
c:/ror/todo/public/../config/../app/views/items/new.rhtml:11)
DEPRECATION WARNING: @flash is deprecated! Call flash.[] instead of 
@flash.[]. Args: ["notice"]  See http://www.rubyonrails.org/deprecation 
for details. (called from 
_run_rhtml_47app47views47layouts47application46rhtml at 
c:/ror/todo/public/../config/../app/views/layouts/application.rhtml:25)
Completed in 1.16200 (0 reqs/sec) | DB: 0.04000 (3%) | 200 OK 
[http://localhost/items/create]
-------------------------------------------------------------------------------

Slds
Posted by Juan Pablo (Guest)
on 12.08.2008 23:15
(Received via mailing list)
Primero creo que deberias de comenzar a sacar los mensajes de 
DEPRECATION !

On Tue, Aug 12, 2008 at 6:12 PM, Mauro Cosatto <
Posted by Ruben Davila (rdavila)
on 13.08.2008 04:24
(Received via mailing list)
Hola Mauro, estas usando mal el helper, para generar las opciones del
selecte le tienes que pasar un array anidado, como solo le estabas 
pasando
un array, se me hace que esta guardando una cadena vacia en el value 
deberia
ser asi:

<td><%= select "item","priority",(1..5).map{ |e| [e,e] } %></td>

http://www.railsbrain.com/api/rails-2.1.0/doc/index.html?a=M001932&name=select

Saludos.

Rubén Dávila Santos.
http://rubenonrails.com
Posted by Daniel Rodriguez Troitiño (Guest)
on 13.08.2008 10:53
(Received via mailing list)
2008/8/13 Ruben. D. <ruben.grunge84@gmail.com>:
> Hola Mauro, estas usando mal el helper, para generar las opciones del
> selecte le tienes que pasar un array anidado, como solo le estabas pasando
> un array, se me hace que esta guardando una cadena vacia en el value deberia
> ser asi:
>
> <td><%= select "item","priority",(1..5).map{ |e| [e,e] } %></td>
>
> http://www.railsbrain.com/api/rails-2.1.0/doc/index.html?a=M001932&name=select
>

Creo que no es necesario especificar arrays anidados, en el caso de un
array simple se utiliza el texto como texto a mostrar y no se utiliza
value, lo que para HTML significa que el value es el texto. El
resultado te tú código y el suyo creo que va a ser el mismo.

Estoy pensado que el error puede ser por que el valor que llega es una
cadena y el validates comprueba con números (la definición de priority
en la base de datos debería determinar como trata Rails a la
propiedad). Quizá probando con:

validates_inclusion_of :priority, :in=>(1..5).map(&:to_s),
:message=>"must be between
1 (high) and 5 (low)"

Se te solucione.

Por cierto, como dice Juan Pablo, arregla esos DEPRECATION WARNING.
Quizá sean la razón de tu problema. Lee bien el texto del aviso y
actua en consecuencia.

Suerte.
Posted by Mauro Cosatto (mcosatto)
on 13.08.2008 17:05
Juan Pablo wrote:
> Primero creo que deberias de comenzar a sacar los mensajes de 
> DEPRECATION !
> 
> On Tue, Aug 12, 2008 at 6:12 PM, Mauro Cosatto <

Ok, solucione 3 de los 5, quizas me puedan ayudar con este:
----------------------------------------------------------------------------------
  def create
    begin
     @item = Item.new(@params[:item])    ***Se que el error esta en esta 
linea***
     if @item.save
       flash['notice'] = 'Tarea creada exitosamente.'
       redirect_to :action => 'list_by_priority'
     else
       @categories = Category.find :all
       render_action 'new'
     end
    rescue
       flash['notice'] = 'La tarea no se pudo grabar.'
       redirect_to :action => 'new'
    end
  end
----------------------------------------------------------------------------------

Muchas gracias
Posted by Manuel González Noriega (Guest)
on 13.08.2008 17:09
(Received via mailing list)
2008/8/13 Mauro Cosatto <ruby-forum-incoming@andreas-s.net>:
> Juan Pablo wrote:
>
> Ok, solucione 3 de los 5, quizas me puedan ayudar con este:

@params is deprecated! Call params.[] instead of
@params.[]

;)


--
Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o http://simplelogica.net/logicola/
Recuerda comer mucha fruta y verdura.
Posted by Ruben Davila (rdavila)
on 13.08.2008 17:13
(Received via mailing list)
Hola Daniel, tienes razon, si le pasas un array simple, toma el mismo 
valor
para el value y el caption, pero no es necesario convertir a cadena los
valores para que funcione la validacion, yo uso esa validacion en varios
lados sin ningun problema, me parece que el problema esta por otro lado.

Salud.
Posted by Juan Pablo (Guest)
on 13.08.2008 17:14
(Received via mailing list)
Por si no entendiste lo que te dice Manuel, saca el @

2008/8/13 Manuel González Noriega <manuel.gonzalez.noriega@gmail.com>
Posted by Mauro Cosatto (mcosatto)
on 13.08.2008 17:32
Juan Pablo wrote:
> Por si no entendiste lo que te dice Manuel, saca el @
> 
> 2008/8/13 Manuel González Noriega <manuel.gonzalez.noriega@gmail.com>

Si, ya, muchas gracias a todos, ya limpie los deprecations.

Lo que si el error de la validacion de la prioridad sigue igual :(

Muchas gracias de todos modos

Slds

Mauro
Posted by Daniel Rodriguez Troitiño (Guest)
on 13.08.2008 17:44
(Received via mailing list)
2008/8/13 Ruben. D. <ruben.grunge84@gmail.com>:
> Hola Daniel, tienes razon, si le pasas un array simple, toma el mismo valor
> para el value y el caption, pero no es necesario convertir a cadena los
> valores para que funcione la validacion, yo uso esa validacion en varios
> lados sin ningun problema, me parece que el problema esta por otro lado.
>
> Salud.
>

Sí, ya lo supuse, que si la columna de la base de datos le dice a
Rails que es un número la validación con números debería servir.

Mauro ¿cómo está definido "property" en la tabla de la base de datos
(la migración o el SQL)? Además parece que estás utilizando un Rails
algo antiguo, parece una versión 1.2.x ¿podrías decirnos cuál versión
por si las moscas?
Posted by Mauro Cosatto (mcosatto)
on 13.08.2008 20:08
Daniel Rodriguez Troitiño wrote:
> 2008/8/13 Ruben. D. <ruben.grunge84@gmail.com>:
>> Hola Daniel, tienes razon, si le pasas un array simple, toma el mismo valor
>> para el value y el caption, pero no es necesario convertir a cadena los
>> valores para que funcione la validacion, yo uso esa validacion en varios
>> lados sin ningun problema, me parece que el problema esta por otro lado.
>>
>> Salud.
>>
> 
> Sí, ya lo supuse, que si la columna de la base de datos le dice a
> Rails que es un número la validación con números debería servir.
> 
> Mauro ¿cómo está definido "property" en la tabla de la base de datos
> (la migración o el SQL)? Además parece que estás utilizando un Rails
> algo antiguo, parece una versión 1.2.x ¿podrías decirnos cuál versión
> por si las moscas?

La version de rails es 1.2.3, con respecto a la tabla te referis a 
"priority" no? lo definí como "tinyint" (1)

Slds

Mauro
Posted by Daniel Rodriguez Troitiño (Guest)
on 13.08.2008 23:58
(Received via mailing list)
2008/8/13 Mauro Cosatto <ruby-forum-incoming@andreas-s.net>:
>
> La version de rails es 1.2.3, con respecto a la tabla te referis a
> "priority" no? lo definí como "tinyint" (1)
>
> Slds
>

De la documentación de ActiveRecord 1.15.5 (creo que corresponde a
Rails 1.2.5, es el más antiguo que tengo instalado):

# By default, the MysqlAdapter will consider all columns of type 
tinyint(1)
# as boolean. If you wish to disable this emulation (which was the 
default
# behavior in versions 0.13.1 and earlier) you can add the following 
line
# to your environment.rb file:
#
#   ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans = 
false

Puede que sea eso. O metes esa línea en el environment.rb (y haces los
boolean de otra forma) o amplias el rango de tus valores de prioridad
a tinyint(2) o algo así.

Creo que has chocado contra un "feature" muy extraño de Rails.

Suerte.
Posted by Mauro Cosatto (mcosatto)
on 14.08.2008 15:18
Daniel Rodriguez Troitiño wrote:
> 2008/8/13 Mauro Cosatto <ruby-forum-incoming@andreas-s.net>:
>>
>> La version de rails es 1.2.3, con respecto a la tabla te referis a
>> "priority" no? lo definí como "tinyint" (1)
>>
>> Slds
>>
> 
> De la documentación de ActiveRecord 1.15.5 (creo que corresponde a
> Rails 1.2.5, es el más antiguo que tengo instalado):
> 
> # By default, the MysqlAdapter will consider all columns of type 
> tinyint(1)
> # as boolean. If you wish to disable this emulation (which was the 
> default
> # behavior in versions 0.13.1 and earlier) you can add the following 
> line
> # to your environment.rb file:
> #
> #   ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans = 
> false
> 
> Puede que sea eso. O metes esa línea en el environment.rb (y haces los
> boolean de otra forma) o amplias el rango de tus valores de prioridad
> a tinyint(2) o algo así.
> 
> Creo que has chocado contra un "feature" muy extraño de Rails.
> 
> Suerte.


Listo muchachos!, muchisimas gracias, tema solucionado.
Alcanzo con modificar en mi tabla el rango a tinyint(2) como comento el 
amigo Daniel Rodriguez.

Un abrazo

Mauro