Necesito llamar a la acción de creación en el controlador A, desde el controlador B.
La razón es que necesito redirigir de manera diferente cuando llamo desde el controlador B.
¿Se puede hacer en Rails?
ruby-on-rails
ddayan
fuente
fuente

Respuestas:
Puede usar una redirección a esa acción:
Más sobre: Guía de rieles
Para representar la nueva acción:
fuente
renderlugar deredirect_to. ¿Qué dices, @Spyros?redirect_tono permite su usopost: :methody esto puede ser útil particularmente para redirigir a unacreateacción ya existente de otro controlador como @ddayan pidió la primera vez. Tengo una situación similar en la que, en alguna situación, debería crear otro objeto. Llamar a la otracreateacción puede ser más SECO ..Para usar un controlador de otro, haga esto:
fuente
controller_you_want, lo haríacontroller_you_want.process(:action_you_want)render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)parece funcionar para devolver JSON desde el otro controladorcontroller_you_want.requestpero no pudieron hacer que este disparo pasara una instancia de hash o parámetros.paramsestén disponibles paracontroller_you_wantajustando elrequestde la tercera línea. ¿Es eso lo que estás preguntando?render html: controller_you_want.process(:action_you_want)La lógica que presenta no es MVC, entonces no es compatible con Rails.
Un controlador muestra una vista o redirecciona
Un método ejecuta código
A partir de estas consideraciones, le aconsejo que cree métodos en su controlador y los llame desde su acción.
Ejemplo:
Dicho esto, puede hacer exactamente lo mismo a través de diferentes controladores y convocar un método desde el controlador A mientras está en el controlador B.
El vocabulario es sumamente importante por eso insisto mucho.
fuente
get_variablepuede llamar ahora desde otro controlador?Puede usar
url_forpara obtener la URL de un controlador y una acción y luego usarredirect_topara ir a esa URL.fuente
redirect_to url_for(:controller => :controller_name, :action => :action_name, :param1 => :val1, :param2 => :val2)dará como resultado/contorller_name/action_name?param1=val1¶m2=val2. Ver los documentosEsta es una mala práctica para llamar a otra acción del controlador.
Debieras
Mi opinión:
El tercer enfoque es el que solía hacer a menudo. Así que mostraré un pequeño ejemplo.
Entonces puede enviar a este
redirect_toparámetro de acción , que puede ser cualquier ruta que desee.fuente
/modelso una clase o módulo ordinario/lib). El único problema es que si su controlador se comunica con la vista a través de variables de instancia, tendría que arreglar esa duplicación de otra manera.¿Quizás la lógica podría extraerse en un ayudante? los ayudantes están disponibles para todas las clases y no transfieren el control. Puede verificar dentro de él, tal vez el nombre del controlador, para ver cómo se llama.
fuente
Composición al rescate!
Dada la razón, en lugar de invocar acciones entre controladores, uno debería diseñar controladores para separar partes compartidas y personalizadas del código. Esto ayudará a evitar tanto la duplicación de código como la ruptura del patrón MVC.
Aunque eso se puede hacer de varias maneras, usar preocupaciones ( composición ) es una buena práctica.
Espero que ayude.
fuente
Puede llamar a otra acción dentro de una acción de la siguiente manera:
redirect_to action: 'action_name'
fuente
Separe estas funciones de los controladores y colóquelas en el archivo de modelo. Luego incluya el archivo del modelo en su controlador.
fuente