Problemas con validates_format_of

Buenas amigos tengo el siguiente problema y agradeceria cualquier ayuda

estoy validando campos de texto de una tabla en su respectivo modelo
para solo aceptar caracteres validos, estoy utilizando una expresion
regular
validates_format_of :nombre, :with =>
/^[a-záéíóúÁÉÍÓÚ.,;+*%?\d\s_()%-]{1,255}$/i, :message =>“debe ser
valido”

esta es la q e probado y la q mas se ajusta a lo q necesito que es
permitir solo caractes validos en la tabla y asi evitar errores a la
hora de insertar en la base de datos.
La expresion funciona a medias por que si en el campo de texto q
estoy validando coloco por ejemplo alguno de estos caracteres" ¶ ¢ " por
nombrar alguno
funciona y me muestra la advertencia pero si al colocar estos caracteres
y coloco uno o varios “enter” antes o despues ya la validacion no
funciona. Si no queda claro q es lo que estoy intentando diganme y
tratare de ser mas claro.

Gracias por cualquier sugerencia

Hola esto es un ejemplo rápido con el interprete de ruby (para arrancar
el
interprete pon: irb en tu terminal)

Aqui va, voy a sustituir un retorno de carro de un cadena por un espacio
en
blanco
irb
rb(main):001:0> micadena =“mi cadena con”
=> “mi cadena con”
irb(main):003:0> micadena << "
irb(main):004:0" retorno de carro"
=> “mi cadena con\nretorno de carro” OBSERVA EL (\n) QUE ES EL RETORNO
DE
CARRO
irb(main):005:0> micadena.gsub!(“\n”," ")
=> “mi cadena con retorno de carro”

Como ves se ha sustituido el (\n) por un " ". usa este metodo ----->
gsub!(“cosa que quiero quitar”,“cosa que quiero poner en su lugar”)
ponlo antes de pasar por la expresion regular y lo que pases a esta ira
sin
retornos de carro

Un saludo

El 6 de agosto de 2008 21:52, Jhon K.
[email protected]escribió:

Buenas,

creo que lo que quieres es que la expresión regular te contemple
multilineas, en teoria se hace añadiendo el modificador /m en la
regexp, por lo que deberias poner /^[a…]$/im <-- Fijate en la m
detrás de la i

No lo he probado, por lo que no estoy seguro, pero deberia funcionar.

Salutaciones,

Isaac Feliu

2008/8/6 Jhon K. [email protected]:

permitir solo caractes validos en la tabla y asi evitar errores a la
hora de insertar en la base de datos.
La expresion funciona a medias por que si en el campo de texto q
estoy validando coloco por ejemplo alguno de estos caracteres" ¶ ¢ " por
nombrar alguno
funciona y me muestra la advertencia pero si al colocar estos caracteres
y coloco uno o varios “enter” antes o despues ya la validacion no
funciona. Si no queda claro q es lo que estoy intentando diganme y
tratare de ser mas claro.

Si te refieres a que aceptas opcionalmente leading y trailing
whitespace:

/\A\s*…\s*\z/

donde en los … va tu misma regexp sin los anchors.

En tal caso podria ser que la longitud del campo sea mayor que 255
contando con el whitespace. Lo mas sencillo seria validar la longitud
en una validacion separada y cambiar el cuantificador por algo mas
sencillo como +.

Por otro lado si quieres ser tolerante a leading y trailing whitespace
pero se entiende que no son caracteres del campo puedes definir
nombre= para que lo borre si lo hay y llame a write_attribute con el
resultado. En esta opcion la regexp no hay que tocarla. (Pero hay que
cambiar ^ por \A y $ por \z.)

por lo que deberias poner /^[a…]$/im

Buenas Isaac, por aprender y ya que esta abierto el hilo, pordrias
explicar
un poco más de que va lo del modificador. Lo podria buscar en google,
pero
creo que el hilo quedaría mejor con esa explicación :slight_smile:

Un saludo

2008/8/7 Isaac Feliu Pérez [email protected]

Muchas gracias por la aclaracion

Un saludo

El 7 de agosto de 2008 11:10, Isaac Feliu Pérez
[email protected]escribió:

Buenas,

bueno, partiendo del hecho que no soy ningún experto en expresiones
regulares, que es todo un mundo complicado y solo para masters del
universo, pongamos para desarrolladores en Perl. :stuck_out_tongue:

El tema de los modificadores, lo que hacen es justo lo que su nombre
indica, “modifican” el comportamiento de la expressión regular, como
por ejemplo hacer que sean no sensibles a mayusculas/minusculas (/i),
que sean multilinea (/m), que ignore los espacios entre tokens de la
expresion (/x) y alguno más. Se ponen siempre al final de la expresión
regular y existen para todos los lenguajes, pues no es una cosa del
ruby, sino de las expresiones regulares propiamente dicho.

Por ejemplo:

/[a-z]/i es lo mismo que /[a-zA-Z]/ y /a b c/x es lo mismo que /abc/

Por si quereis echarle un vistazo:

Salutaciones,

Isaac Feliu

En Perl ^ hace matching con el principio de cadena nada mas, salvo que
uses el modificador /m.

En Ruby no existe tal distincion. Perlosamente visto, en Ruby siempre
esta /m puesto. Por ello en Ruby (como en Perl multilinea) el anchor
para principio de cadena es \A, y el anchor para final de cadena con
newline opcional es \Z, el final de cadena absoluto es \z. Los anchors
^ y $ son los analogos pero no a nivel de cadena si no a nivel de
linea, esto es relevante si la cadena puede ser multilinea.

2008/8/7 Xavier N. [email protected]:

En Perl ^ hace matching con el principio de cadena nada mas, salvo que
uses el modificador /m.

En Ruby no existe tal distincion. Perlosamente visto, en Ruby siempre
esta /m puesto. Por ello en Ruby (como en Perl multilinea) el anchor
para principio de cadena es \A, y el anchor para final de cadena con
newline opcional es \Z, el final de cadena absoluto es \z. Los anchors
^ y $ son los analogos pero no a nivel de cadena si no a nivel de
linea, esto es relevante si la cadena puede ser multilinea.

Ah, olvide comentar otro gotcha: En Perl el modificador /m se usa para
activar multilinea, y /s para que “.” haga matching con \n. Bien, en
Ruby el modificador analogo a /m no existe como deciamos, y el
modificador analogo a /s se llama … /m!

Isaac Feliu Pérez wrote:

Ah� est�n los gur�s del Perl deleitandonos con las regexpes… :wink:

Eres un monstruo!

Salutaciones,

Isaac Feliu

BUenas e probado con lo que dicen y no e podido resolver mi problema
tienen alguna sugerencia? los enter en lo que ingreso hacen q la
validacion no funcione y los caracteres que no quiero que sean aceptados
pasan la validacion

Ahí están los gurús del Perl deleitandonos con las regexpes… :wink:

Eres un monstruo!

Salutaciones,

Isaac Feliu

2008/8/7 Jhon K. [email protected]:

BUenas e probado con lo que dicen y no e podido resolver mi problema
tienen alguna sugerencia? los enter en lo que ingreso hacen q la
validacion no funcione y los caracteres que no quiero que sean aceptados
pasan la validacion

Por favor dinos donde estan permitidos los enters, y copia en el mail
los validates_*.

2008/8/8 Jhon K. [email protected]:

validates_format_of :comentario, :with => /^[
,&%;áéíóúÁÉÍÓÚa-zA-Z0-9@._-]*$/m, :message =>“debe ser valido”

La /m en Ruby significa “que el punto haga matching con \n”. Como no
usas el punto como metacaracter esa /m no hace nada (el punto dentro
de una clase de caracteres [.] no es metacaracter, es un punto
literalmente).

El problema que tienes es que una linea en blanco hace matching con

^[lo que sea]*$

porque hace matching con

^$

y * permite que haya 0 ocurrencias de la clase de caracteres.

Repito que ^ y $ son anchors para principio y final de linea
incondicionalmente en Ruby. Si quieres anchors para principio y final
de cadena has de usar \A y \z en su lugar respectivamente.

Xavier N. wrote:

2008/8/7 Jhon K. [email protected]:

BUenas e probado con lo que dicen y no e podido resolver mi problema
tienen alguna sugerencia? los enter en lo que ingreso hacen q la
validacion no funcione y los caracteres que no quiero que sean aceptados
pasan la validacion

Por favor dinos donde estan permitidos los enters, y copia en el mail
los validates_*.

Buenas amigo esta es una de las validaciones voy a aplicarla a varios
campos por ejemplo a este campo comentario

validates_format_of :comentario, :with => /^[
,&%;áéíóúÁÉÍÓÚa-zA-Z0-9@._-]*$/m, :message =>“debe ser valido”

solo quiero q acepte los caracteres q estan dentro del corchete pero no
funciona del todo bien e colocado al final /m probando con lo que me
han sugerido pero todavia tiene detalles si coloco dentro del corchete
los caracteres \n o \r para enter o salto de linea tampoco funciona
correctamente por ejemplo

ss

=

saa

si coloco en el campo comentario esto q esta arriba no muestra el
mensaje “debe ser valido”

ss

=

pero si escribes esto si lo hace; este es pon decirte uno de los casos…

agradeceria cualquier sugerencia

Xavier N. wrote:

2008/8/8 Jhon K. [email protected]:

validates_format_of :comentario, :with => /^[
,&%;áéíóúÁÉÍÓÚa-zA-Z0-9@._-]*$/m, :message =>“debe ser valido”

La /m en Ruby significa “que el punto haga matching con \n”. Como no
usas el punto como metacaracter esa /m no hace nada (el punto dentro
de una clase de caracteres [.] no es metacaracter, es un punto
literalmente).

El problema que tienes es que una linea en blanco hace matching con

^[lo que sea]*$

porque hace matching con

^$

y * permite que haya 0 ocurrencias de la clase de caracteres.

Repito que ^ y $ son anchors para principio y final de linea
incondicionalmente en Ruby. Si quieres anchors para principio y final
de cadena has de usar \A y \z en su lugar respectivamente.

Gracias mi pana fue de gran ayuda tu comentario al parecer ya solucione
el problema la expresion quedo asi

validates_format_of :nombre, :with => /\A[
,&%;áéíóúÁÉÍÓÚa-zA-Z0-9@\t\r\n._-]*\z/, :message =>“debe ser valido”

con esto evaluo un texto completo y acepto tabuladores,enter, etc…

la razon de aceptarlos es para evitar posibles errores si se copia y
pega caracteres desde una aplicacion o documento de texto , lo q
faltaria a esta expresion es agregarle mas caracteres validos como las
comillas, parentesis,llaves, etc… de igual manera seguire pobando y
comentare nuevas cosas.

De nuevo gracias muchas

Xavier N. wrote:

2008/8/8 Jhon K. [email protected]:

validates_format_of :comentario, :with => /^[
,&%;áéíóúÁÉÍÓÚa-zA-Z0-9@._-]*$/m, :message =>“debe ser valido”

La /m en Ruby significa “que el punto haga matching con \n”. Como no
usas el punto como metacaracter esa /m no hace nada (el punto dentro
de una clase de caracteres [.] no es metacaracter, es un punto
literalmente).

El problema que tienes es que una linea en blanco hace matching con

^[lo que sea]*$

porque hace matching con

^$

y * permite que haya 0 ocurrencias de la clase de caracteres.

Repito que ^ y $ son anchors para principio y final de linea
incondicionalmente en Ruby. Si quieres anchors para principio y final
de cadena has de usar \A y \z en su lugar respectivamente.

A otra cosa es necesario colocar \r\n para lo q yo necesito si no
funciona correctamente , hasta luego