2012-06-10 19 views
7

¿Cómo añado de manera condicional un hash a una matriz *args en Rails? No quiero pisar el valor original si existe.¿Cómo agrego un hash a * args?

Por ejemplo, tengo un método que recibe una matriz:

def foo(*args) 
    # I want to insert {style: 'bar'} into args but only if !style.present? 
    bar(*args)        # do some other stuff 
end 

He empezado a utilizar los métodos y extract_options reverse_merge proporcionados por los carriles:

def foo(*args) 
    options = args.extract_options!   # remove the option hashes 
    options.reverse_merge! {style: 'bar'} # modify them 
    args << options       # put them back into the array 
    bar(*args)        # do some other stuff 
end 

funciona, pero parece detallado y no muy ruby-ish. Siento que me he perdido algo.

+1

¿Hay alguna razón por la que deba volver a colocarla en la lista 'args'? Creo que los dos primeros son comunes en la fuente de Rails. –

+1

Buena pregunta. Sí, la función 'foo' pasa los argumentos a otra función. Editaré la pregunta para mostrar eso. Estoy escribiendo una clase FormBuilder, muchos ayudantes llaman a otros ayudantes. – IAmNaN

Respuesta

7

Sí, #extract_options! es la manera de hacerlo en Rails. Si quieres ser más elegante, tendrás que alias, o encontrar tu propia forma de manejar esta necesidad, o buscar gemas por alguien que ya lo haya hecho.

+1

Gracias, agradezco los comentarios. – IAmNaN

Cuestiones relacionadas