2011-01-13 10 views
32

Escribo un ayudante que agrega un atributo HTML a una etiqueta link_to en rieles. Entonces, mi pensamiento es que mi método de ayuda debe aceptar cualquier parámetro o bloque que se le pase, llame a link_to con esos mismos parámetros, agregue su atributo a lo que se devuelve y devuelva el resultado a la persona que llama.Ruby: ¿Cómo paso todos los parámetros y bloques recibidos por un método a otro?

De esta manera:

def link_to(*args, &block) 
    ... rails code in link_to ... 
end 

def myhelper(*args, &block) # Notice that at this point, 'args' has already 
    link_to()     # become an array of arguments and 'block' has 
    ... my code ...   # already been turned into a Proc. 
end 

myhelper() # Any arguments or blocks I pass with this call should make 
      # it all the way through to link_to. 

Por lo tanto, como se puede ver, no parece haber ninguna manera (que no implica un montón de código y la bifurcación condicional) para pasar lo myhelper ha recibido a link_to sin girar todos los parámetros volvieron a su aspecto original antes de que llegaran a mi método.

¿Hay una solución más 'Ruby-like' a este problema?

+2

Tenga en cuenta que en Ruby 2.0, argumentos con nombre también pueden tener que ser reenviado ... – Ajedi32

Respuesta

61

Puede usar * y & en llamadas a métodos para convertir las matrices en listas de argumentos y procesos en bloques. Por lo que sólo puede hacer esto:

def myhelper(*args, &block) 
    link_to(*args, &block) 
    # your code 
end 
+1

me siento estúpido ahora :-) Estaba seguro de que estaba equivocado, y yo estaba escribiendo algunos muestra el código para probarlo y, por supuesto, tenías razón. ¡Gracias! – marcusM

+5

¿Este enfoque funciona con argumentos con nombre en Ruby 2.0? – Ajedi32

+0

@ Ajedi32 sí, están agrupados en hash, p. Ej. 'foo (: bar, baz: 'qux')' se convierte en '[: bar, {: baz =>" qux "}]'. –

Cuestiones relacionadas