Parámetros opcionales en un helper

Tengo una función en el helper para generar los campos… y para tratar
los parámetros que son opcionales, me monto una condición:

campo = opciones[:long_max] ? form.text_field( nombre, :maxlength =>
opciones[:long_max] ) : form.text_field nombre

El problema es que:

A.- Es feo y repetitivo

B.- No escala bien cuando son varios los parámetros opcionales:

if opciones[:class]
campo = opciones[:long_max] ? form.text_field(nombre, :class =>
opciones[:class], :maxlength => opciones[:long_max]) :
form.text_field(nombre, :class => opciones[:class])
else
campo = opciones[:long_max] ? form.text_field( nombre, :maxlength =>
opciones[:long_max] ) : form.text_field nombre
end

Yo lo que quiero es algo así como esto:
campo = form.text_field(nombre, :class => opciones[:class] if
opciones[:class], :maxlength => opciones[:long_max] if
opciones[:long_max])

pero eso no funciona… ¿alguien sabe una forma de pasar parámetros
condicionalmente?

s2

2008/9/23 Fernando C. [email protected]

Yo lo que quiero es algo así como esto:
campo = form.text_field(nombre, :class => opciones[:class] if
opciones[:class], :maxlength => opciones[:long_max] if
opciones[:long_max])

pero eso no funciona… ¿alguien sabe una forma de pasar parámetros
condicionalmente?

Mmm, ¿hay alguna razón para que las claves de opciones no se llamen
igual
que las que espera text_field (i.e long_max != maxlength) ? Si se
llamasen
igual, sólo tendrías que hacer un merge de opciones con el options de
text_field, o pasárselo directamente.

Manuel González Noriega wrote:

2008/9/23 Fernando C. [email protected]

Yo lo que quiero es algo así como esto:
campo = form.text_field(nombre, :class => opciones[:class] if
opciones[:class], :maxlength => opciones[:long_max] if
opciones[:long_max])

pero eso no funciona… ¿alguien sabe una forma de pasar parámetros
condicionalmente?

Mmm, ¿hay alguna razón para que las claves de opciones no se llamen
igual
que las que espera text_field (i.e long_max != maxlength) ? Si se
llamasen
igual, sólo tendrías que hacer un merge de opciones con el options de
text_field, o pasárselo directamente.

No hay ningún problema en que se llamara maxlength en vez de long_max,
pero en opciones estoy recogiendo algunas que son de uso interno (tipo,
prefijo, sufijo) y no le puedo pasar directamente; supongo que la
solución sería cambiar la declaración
def campo(form, nombre, opciones={})
por
def campo(form, nombre, opciones1={}, opciones2={})

pero esto supondría rehacer todas las llamadas… joer!!

PD: ¿Cómo se hace exactamente el merge?

s2

Manuel González Noriega wrote:

2008/9/23 Fernando C. [email protected]

Manuel González Noriega wrote:

No hay ningún problema en que se llamara maxlength en vez de long_max,
pero en opciones estoy recogiendo algunas que son de uso interno (tipo,
prefijo, sufijo) y no le puedo pasar directamente; supongo que la
solución sería cambiar la declaración
def campo(form, nombre, opciones={})
por
def campo(form, nombre, opciones1={}, opciones2={})

¿No te valdría esto?

def campo(form, nombre, opciones={})

html_options = {}

%w(maxlength class).each do |attrb|
if opciones.has_key?(attrb.to_sym)
html_options[attrb] = opciones.delete(attrb)
end
end

continuamos con los atributos html en html_options y los privados en

opciones

end

Que caña!! Es perfecto, muchas gracias!! Sólo una cosa, por si alguien
más lo quiere aprovechar: hay un fallito, donde pone
opciones.delete(attrb) debe poner opciones.delete(attrb.to_sym) , falta
el to_sym (y sin él, no va…)

Probablemente se pueda hacer más fácil y más bonito :slight_smile:

Lo dudo…

s2

2008/9/23 Fernando C. [email protected]

Manuel González Noriega wrote:

No hay ningún problema en que se llamara maxlength en vez de long_max,
pero en opciones estoy recogiendo algunas que son de uso interno (tipo,
prefijo, sufijo) y no le puedo pasar directamente; supongo que la
solución sería cambiar la declaración
def campo(form, nombre, opciones={})
por
def campo(form, nombre, opciones1={}, opciones2={})

¿No te valdría esto?

def campo(form, nombre, opciones={})

html_options = {}

%w(maxlength class).each do |attrb|
if opciones.has_key?(attrb.to_sym)
html_options[attrb] = opciones.delete(attrb)
end
end

continuamos con los atributos html en html_options y los privados en

opciones

end

Probablemente se pueda hacer más fácil y más bonito :slight_smile: