Llamar funcion desde un modelo


#1

BUenas amigos tengo una duda y agradeceria cualquier ayuda.

Tengo en un modelo una validacion con expresion regular pero tengo esa
expresion en varios archivos y me gustaria es desde el modelo invocar
una funcion que este por ejemplo en el helper y hay se haga la
validacion y asi evitar modificar la expresion en todos los archivos si
no modificarla en alguna funcion.

Si no e sido claro por favor diganme y tratare de hacerme entender


#2

El día 5 de noviembre de 2008 17:11, Jhon K.
removed_email_address@domain.invalid
escribió:> BUenas amigos tengo una duda y agradeceria cualquier ayuda.

Tengo en un modelo una validacion con expresion regular pero tengo esa
expresion en varios archivos y me gustaria es desde el modelo invocar
una funcion que este por ejemplo en el helper y hay se haga la
validacion y asi evitar modificar la expresion en todos los archivos si
no modificarla en alguna funcion.

Puedes crearte una clase Utils en la carpeta /lib

Rollo /lib/utils.rb

class Utils
def self.is_valid( string )
return string ~= /que siii/
end
end

La requieres en el /config/environment.rb con

require ‘utils’

Y la usas donde quieras con

Utils.is_valid( “que siii es válido” )

Todo esto al vuelo… seguro que hay errores.

f.


#3

El Wednesday 05 November 2008 17:11:03 Jhon K.
escribió:> BUenas amigos tengo una duda y agradeceria cualquier ayuda.

Tengo en un modelo una validacion con expresion regular pero tengo esa
expresion en varios archivos y me gustaria es desde el modelo invocar
una funcion que este por ejemplo en el helper y hay se haga la
validacion y asi evitar modificar la expresion en todos los archivos si
no modificarla en alguna funcion.

Si no e sido claro por favor diganme y tratare de hacerme entender

Igual lo mejor es que tengas la expresion regular como una constante en
el
modelo por ejemplo. Y la usas con Modelo::CONSTANTE


Sergio Cambra .:: entreCables - Symbol Servicios Informáticos S.L. ::.
Nicolás Guillén 6, locales 2 y 3. 50.018 Zaragoza
T) 902 021 404 F) 976 52 98 07 E) removed_email_address@domain.invalid


#4

A mi me suena mejor la solucion de fernando. Pero es solo una
opinión
Un saludo

2008/11/6 Sergio Cambra .:: entreCables - Symbol Servicios
Informáticos S.L. ::. removed_email_address@domain.invalid:


#5

Jhon K. wrote:

BUenas amigos tengo una duda y agradeceria cualquier ayuda.

Tengo en un modelo una validacion con expresion regular pero tengo esa
expresion en varios archivos y me gustaria es desde el modelo invocar
una funcion que este por ejemplo en el helper y hay se haga la
validacion y asi evitar modificar la expresion en todos los archivos si
no modificarla en alguna funcion.

Si no e sido claro por favor diganme y tratare de hacerme entender

Yo lo que hago muchas veces es, en vez de meterlo en forma de función
independiente, lo meto como método que extiende a una clase. Por
ejemplo, una función para sacar números con separador de miles, o una
que permite aceptar URLs con o sin el http:// , serían así:

class String

Si una URL no lleva delante el http://, se lo pone

def pon_http
result = “http://#{self}”.sub(“http://http://”, “http://”)
end
end

class Fixnum
def separar_miles
self.to_s.gsub(/(.)(?=.{3}+$)/, %q(\1.))
end
end

Y se llamarían, tanto desde el modelo como desde la vista o el
controller, de la misma forma:

objeto.url.pon_http
objeto.veces_leido.separar_miles

Las extensiones de las clases las meto en lib/aplicacion.rb, y luego
meto un
require ‘aplicacion.rb’
en el archivo de configuración config/environment.rb

s2


#6

Fernando G. wrote:

El d�a 5 de noviembre de 2008 17:11, Jhon K.
removed_email_address@domain.invalid
escribi�:> BUenas amigos tengo una duda y agradeceria cualquier ayuda.

Tengo en un modelo una validacion con expresion regular pero tengo esa
expresion en varios archivos y me gustaria es desde el modelo invocar
una funcion que este por ejemplo en el helper y hay se haga la
validacion y asi evitar modificar la expresion en todos los archivos si
no modificarla en alguna funcion.

Puedes crearte una clase Utils en la carpeta /lib

Rollo /lib/utils.rb

class Utils
def self.is_valid( string )
return string ~= /que siii/
end
end

La requieres en el /config/environment.rb con

require ‘utils’

Y la usas donde quieras con

Utils.is_valid( “que siii es v�lido” )

Todo esto al vuelo… seguro que hay errores.

f.

Gracias por responder, e seguido los pasos o consejos que me has dado
pero me muestra unos errores por ejemplo

  • si hago lo cambios que mencionas me muestra el siguiente error
    undefined method `is_valid’ for WEBrick::Utils:Module

  • si hago lo cambios que mencionas y detengo el servidor y lo pongo a
    correr otra vz el sistema no corre, vueleve a correr cuando quito esta
    linea
    require ‘utils’ de /config/environment.rb

si me puedes dar otro consejo lo agradeceria


#7

Yo lo que hago muchas veces es, en vez de meterlo en forma de función
independiente, lo meto como método que extiende a una clase. Por
ejemplo, una función para sacar números con separador de miles, o una
que permite aceptar URLs con o sin el http:// , serían así:

class String

Si una URL no lleva delante el http://, se lo pone

def pon_http
result = “http://#{self}”.sub(“http://http://”, “http://”)
end
end

class Fixnum
def separar_miles
self.to_s.gsub(/(.)(?=.{3}+$)/, %q(\1.))
end
end

Y se llamarían, tanto desde el modelo como desde la vista o el
controller, de la misma forma:

objeto.url.pon_http
objeto.veces_leido.separar_miles

Las extensiones de las clases las meto en lib/aplicacion.rb, y luego
meto un
require ‘aplicacion.rb’
en el archivo de configuración config/environment.rb

s2

Gracias por responder amigos
una pregunta o duda q tengo con lo que me sugieres es que en la carpeta
lib/
no tengo un archivo llamado aplicacion.rb , un archivo con ese nombre lo
tengo el la carpeta app/controllers


#8

El día 6 de noviembre de 2008 17:40, Jhon K.
removed_email_address@domain.invalid
escribió:>> end

objeto.url.pon_http
una pregunta o duda q tengo con lo que me sugieres es que en la carpeta
lib/
no tengo un archivo llamado aplicacion.rb , un archivo con ese nombre lo
tengo el la carpeta app/controllers

Posted via http://www.ruby-forum.com/.


Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es

Haz un pequeño esfuerzo, busca por el árbol de directorios de tu proyecto
rails.

f.


#9

El Thursday 06 November 2008 09:46:33 Andrés gutiérrez
escribió:> A mi me suena mejor la solucion de fernando. Pero es solo una opinión

Un saludo

Depende de si lo que necesita reutilizar es el metodo o la expresion
regular

no modificarla en alguna funcion.
T) 902 021 404 F) 976 52 98 07 E) removed_email_address@domain.invalid


Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es


Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es


Sergio Cambra .:: entreCables - Symbol Servicios Informáticos S.L. ::.
Nicolás Guillén 6, locales 2 y 3. 50.018 Zaragoza
T) 902 021 404 F) 976 52 98 07 E) removed_email_address@domain.invalid


#10

Jhon K. wrote:

Fernando G. wrote:

Gracias por responder, e seguido los pasos o consejos que me has dado
pero me muestra unos errores por ejemplo

  • si hago lo cambios que mencionas me muestra el siguiente error
    undefined method `is_valid’ for WEBrick::Utils:Module

  • si hago lo cambios que mencionas y detengo el servidor y lo pongo a
    correr otra vz el sistema no corre, vueleve a correr cuando quito esta
    linea
    require ‘utils’ de /config/environment.rb

si me puedes dar otro consejo lo agradeceria

En vez de
require ‘utils’

prueba con
require ‘utils.rb’

y reinicia el servidor

s2


#11

Fernando G. wrote:

El d�a 6 de noviembre de 2008 17:40, Jhon K.
removed_email_address@domain.invalid
escribi�:>> end

objeto.url.pon_http
una pregunta o duda q tengo con lo que me sugieres es que en la carpeta
lib/
no tengo un archivo llamado aplicacion.rb , un archivo con ese nombre lo
tengo el la carpeta app/controllers

Posted via http://www.ruby-forum.com/.


Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es

Haz un peque�o esfuerzo, busca por el �rbol de directorios de tu proyecto
rails.

f.

e corregido algubos errores y me muestra este nuevo error

A regular expression must be supplied as the :with option of the
configuration hash

seguire probando para solucionarlo… gracias por sus segerencias


#12

Jhon K. wrote:

Gracias por responder amigos
una pregunta o duda q tengo con lo que me sugieres es que en la carpeta
lib/
no tengo un archivo llamado aplicacion.rb , un archivo con ese nombre lo
tengo el la carpeta app/controllers

La carpeta lib/ es para que pongas tu librería; no necesitas que exista
ya el archivo aplicacion.rb , puedes crearlo tú mismo, o puedes crearlo
con otro nombre (kaka.rb), siempre que en la configuración metas el
require ‘kaka.rb’

No confundas con app/controllers/application.rb, que es el controlador
del que heredan todos los demás… lo que metas en
app/controllers/application.rb será accesible para todos los
controllers, pero no para los modelos!!

s2


#13

Creo que se están mezclando las varias soluciones propuestas.

f.

El día 6 de noviembre de 2008 18:08, Fernando C.


#14

Fernando C. wrote:

Jhon K. wrote:

Fernando G. wrote:

Gracias por responder, e seguido los pasos o consejos que me has dado
pero me muestra unos errores por ejemplo

  • si hago lo cambios que mencionas me muestra el siguiente error
    undefined method `is_valid’ for WEBrick::Utils:Module

  • si hago lo cambios que mencionas y detengo el servidor y lo pongo a
    correr otra vz el sistema no corre, vueleve a correr cuando quito esta
    linea
    require ‘utils’ de /config/environment.rb

si me puedes dar otro consejo lo agradeceria

En vez de
require ‘utils’

prueba con
require ‘utils.rb’

y reinicia el servidor

s

Hola amigos e estado probando su sugerencias, tengo los archivos de esta
manera
-en el environment.rb
coloque esto require ‘utils.rb’

-en el modelo
validates_format_of :nombre, :with => Utils.is_valid(:nombre),
:message =>“debe ser valido”

  • en lib/utils.rb
    class Utils
    def self.is_valid( string )
    num_expr = /\A[
    ,º&%;:="(){}?¿’|$#áéíóúÁÉÍÓÚa-zA-Z0-9@/\t\r\n._-]*\z/
    salida = num_expr.match(string)
    return salida
    end
    end

luego de reiniciar el servidor me muestra este error
can’t convert Symbol into String
cual pregunta sobre el codigo o sugerencia por favor diganme


#15

En general no es recomendable dos archivos con el mismo nombre en
paths donde Rails busca. En particular application.rb si solo hay uno
mejor.

El directorio lib esta en ese path. Si llamas al fichero

lib/my_app_utils.rb

y en el defines una clase o modulo que se llame MyAppUtils no es
necesario tampoco ningun require ya que la carga automatica de
clases/modulos la encontrara.

Tener un lugar asi para utilidades “transversales” es una practica
comun.


#16

Fernando G. wrote:

El d�a 7 de noviembre de 2008 14:48, Jhon K.
removed_email_address@domain.invalid
escribi�:
class Utils

def self.is_valid( string )

num_expr = /\A[
,�&%;:="(){}?�’|$#����������a-zA-Z0-9@/\t\r\n._-]*\z/
salida = num_expr.match(string)
return salida
end
end

El m�todo Regexp.match devuelve ‘nil’ o un objeto ‘MatchData’ y no
true/false como tu quieres:
http://ruby-doc.org/core/classes/Regexp.html#M001226

Puedes modificar el return
as�:return not salida.nil?

O cambiar todo el m�todo si lo que quieres es s�lo saver si coincide
con la regexp o no… y no recuperar todas las ocurrencias mejor
as�:
return string ~= num_expr

y yast�…

Ah�… un consejo de nomenclatura cambia el nombre del m�todo de
is_valid a is_valid? que se suele usar cuando la funci�n devuelve un
booleano.

(Ya s� que yo te lo dije mal)

Suerte
f.

f.

yo habia probado con un simple return true o false pero me da el mismo
error
can’t convert Symbol into String

otra cosa si coloco esto return string ~= num_expr
el servidor no arranca cuando quiero reiniciarlo no se si sera por el
caracter ~ , bueno la verdad es q noc como trabaja esa instruccion


#17

El día 7 de noviembre de 2008 14:48, Jhon K.
removed_email_address@domain.invalid
escribió:

class Utils
def self.is_valid( string )
num_expr = /\A[
,º&%;:="(){}?¿’|$#áéíóúÁÉÍÓÚa-zA-Z0-9@/\t\r\n._-]*\z/
salida = num_expr.match(string)
return salida
end
end

El método Regexp.match devuelve ‘nil’ o un objeto ‘MatchData’ y no
true/false como tu quieres:
http://ruby-doc.org/core/classes/Regexp.html#M001226

Puedes modificar el return
así:return not salida.nil?

O cambiar todo el método si lo que quieres es sólo saver si coincide
con la regexp o no… y no recuperar todas las ocurrencias mejor
así:
return string ~= num_expr

y yastá…

Ah¡… un consejo de nomenclatura cambia el nombre del método de
is_valid a is_valid? que se suele usar cuando la función devuelve un
booleano.

(Ya sé que yo te lo dije mal)

Suerte
f.

f.


#18

El día 7 de noviembre de 2008 15:26, Fernando G.
removed_email_address@domain.invalid
escribió:>

Cagüen… en primer lugar es al revés: =~ sorry:
http://ruby-doc.org/core/classes/String.html#M000792

En segundo lugar creo que el error está en el modelo, prueba así:

validates_format_of :nombre, :with => /\A[
,º&%;:="(){}?¿’|$#áéíóúÁÉÍÓÚa-zA-Z0-9@/\t\r\n._-]*\z/,
:message =>“debe ser valido”

O igual mejor directamente:
validates_format_of :nombre, :with =>
/\A[,º&%;:="(){}?¿’|$#áéíóúÁÉÍÓÚa-zA-Z0-9@/\t\r\n._-]*\z/ , :message
=>“debe ser valido”

Es que creo que el validates_format_of requiere una expresión regular
no un booleano:

http://ar.rubyonrails.com/classes/ActiveRecord/Validations/ClassMethods.html#M000087

Lo que intentas es implementar un nuevo método de validación y eso no
sé como se hace sorry.

f,


#19

El día 7 de noviembre de 2008 15:21, Jhon K.
removed_email_address@domain.invalid
escribió:> Fernando G. wrote:

yo habia probado con un simple return true o false pero me da el mismo
error
can’t convert Symbol into String

otra cosa si coloco esto return string ~= num_expr
el servidor no arranca cuando quiero reiniciarlo no se si sera por el
caracter ~ , bueno la verdad es q noc como trabaja esa instruccion

Cagüen… en primer lugar es al revés: =~ sorry:
http://ruby-doc.org/core/classes/String.html#M000792

En segundo lugar creo que el error está en el modelo, prueba
así:
validates_format_of :nombre, :with => Utils.is_valid( self.nombre ),
:message =>“debe ser valido”

Suerte
f.


#20

El Friday 07 November 2008 16:09:36 Jhon K. escribió:

validates_format_of :nombre, :with => /\A[
Es que creo que el validates_format_of requiere una expresi�n regular
Tienes razon pana con respecto a q requiere una expresion y no un

archivos actualizando la expresion.
Hasta ahora me funciona, cualquier cosa te avisare si la actualizo a
hago alguna modificacion.

Muchas gracias por la ayuda, que bueno es este foro

para eso en vez de usar un metodo usa una constante, por ejemplo cambia
lib/utils.rb:
module Utils
CONSTANTE = /\A[,º&%;:="(){}?¿’|$#a-zA-Z0-9@/\t\r\n._-]*\z/
end
o no uses el lib/utils.rb, y pon la constante directamente en el modelo.
Yo lo
veo mejor así si esa expresion regular solo se usa para ese modelo.


Sergio Cambra .:: entreCables - Symbol Servicios Informáticos S.L. ::.
Nicolás Guillén 6, locales 2 y 3. 50.018 Zaragoza
T) 902 021 404 F) 976 52 98 07 E) removed_email_address@domain.invalid