Rails: ¿Cómo POST internamente a otra acción del controlador?

Esto va a sonar extraño, pero escúchame … Necesito poder hacer el equivalente de una solicitud POST a uno de mis otros controladores. El SimpleController es básicamente una versión simplificada de un controlador más detallado. ¿Cómo puedo hacer esto apropiadamente?

 class VerboseController < ApplicationController def create # lots of required params end end class SimpleController < ApplicationController def create # prepare the params required for VerboseController.create # now call the VerboseController.create with the new params end end 

Tal vez estoy pensando demasiado en esto, pero no sé cómo hacerlo.

Lo que debe evitar activamente es la comunicación entre controladores en una aplicación Rails (o cualquier aplicación web que siga el mismo patrón de vista de adaptador de modelo). Cuando tenga la tentación de hacerlo, considere que es una señal de que está luchando contra los patrones y el marco en el que se basa su aplicación y que confía en que la lógica se ha implementado en la capa incorrecta de su aplicación.

Como @ismaelga sugirió en un comentario; ambos controladores deben invocar algún componente común para manejar este comportamiento compartido y mantener sus controladores “delgados”. En Rails, a menudo es un método en un objeto modelo, especialmente para el tipo de comportamiento de creación que parece preocuparle en este caso.

No deberías estar haciendo esto. ¿Estás creando un modelo? Entonces sería mucho mejor tener dos métodos de clase en el modelo. También se separa mucho mejor el código. Luego puede usar los métodos no solo en los controladores sino también en los trabajos en segundo plano (etc.) en el futuro.

Por ejemplo, si estás creando una persona:

 class VerboseController < ApplicationController def create Person.verbose_create(params) end end class SimpleController < ApplicationController def create Person.simple_create(params) end end 

Luego, en el modelo de persona, podrías ir así:

 class Person def self.verbose_create(options) # ... do the creating stuff here end def self.simple_create(options) # Prepare the options as you were trying to do in the controller... prepared_options = options.merge(some: "option") # ... and pass them to the verbose_create method verbose_create(prepared_options) end end 

Espero que esto pueda ayudar un poco. 🙂