2010-04-26 33 views
9

Cuando se ha llamado a una acción en un controlador, ¿puedo entonces llamar a otra acción desde esa acción?¿Puedo invocar una acción en otra acción (en un controlador de rieles)?

¿Y qué pasaría si ambas acciones tienen alguna plantilla para representar?

+0

Si tiene que hacer esto, recuerde poner el método llamado detrás de 'private', a menos que sea una ruta disponible públicamente –

Respuesta

14

Sí, puede, si está en el mismo controlador.

Llamando zoo proporcionará la plantilla para el zoológico con instancias para @x y @a. Ni foo ni barra serán renderizados. Si ha establecido explícitamente un método render, entonces puede obtener un doble error de representación, a menos que return antes de que se llame a la segunda representación.

def foo 
    @x = 1 
end 

def bar 
    @a = 2 
end 

def zoo 
    foo 
    bar 
end 
+0

si establecí explícitamente un método de renderizado en 'bar', entonces cuando 'zoo' se llama, ¿representará la plantilla de bar (es decir, bar.html.erb)? – Bat

+0

Sí, pero deberá 'devolver la barra' en' zoo'; de lo contrario, recibirá un error de DoubleRender. Probablemente sea mejor resumir la lógica compartida entre 'bar' y' zoo' en un método protegido. –

+0

¡Muchas gracias, amigo! – Bat

0

Puede usar redirect_to para llamar a otra acción dentro de su controlador. Para presentar una plantilla dentro de otra, puede usar parciales y/o diseños.

+3

'redirect_to' no llama a la otra acción (en el sentido de llamar al método), sino que le dice al navegador que solicite la otra acción. Las acciones son solo métodos, que son llamados por 'ActionController' cuando se trata de una solicitud. Se pueden llamar desde otras acciones como @TheWho lo muestra. –

0

Who es correcto sobre cómo llamar a las acciones, pero si llama una acción dentro de una acción necesita refactorizar su código para extraer la lógica que hace lo que está tratando de lograr en su propia acción, entonces permitiendo que cada acción rinda su propia plantilla.

-1

Sí, puedes hacer esto. Y si es posible que, probablemente, hacer una nula una asignación de forma que se mostrará en sus opiniones de una manera agradable

decir (esto siguiente ejemplo tiene el 'my_controller' como el diseño)

class my_controller < application_controller 

    def my_parent_method 
    @text_from_my_child_method = child_method 
    end 

    def child_method 
    return 'hello from child_method' 
    render :layout => false #here we are making the child_method layout false so that it #will not effect the parent method 
    end 

end 

y en su 'my_parent_method.rhtml' (ver) puede utilizar la variable

<%= @text_from_my_child_method %> and it should print 'hello from child_method' 

esperanza esto ayuda

aplausos, sameera

+2

El 'render' nunca se llamará en' child_method'. Estás 'devolviendo' el método antes de que se ejecute la línea 'render'. ¿Estás tratando de mostrar que el 'child_method' no representará una vista? (Eso podría concretarse declarando 'child_method' como' private'.) –

-1

Si desea hacerlo porque hay algún tipo de código común en ambas acciones, tal vez sea mejor refactorizar este código en un before_filter.

Cuestiones relacionadas