2012-05-14 13 views
6

Esto va a sonar extraño, pero escúcheme ... 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?Rieles: ¿Cómo POSTAR internamente a otra acción del controlador?

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 sobre-pensar esto, pero no sé cómo hacer esto.

+1

¿Estás seguro de que lo necesitas? ¿No sería más apropiado tener verbose create como método de Model? –

+5

Es genial que todos digan que no se debe hacer, pero a veces es necesario hacerlo. Por ejemplo, para restaurar los datos POST después de la autenticación, etc. –

+0

@TheDoctorWhat Restaurar datos POST después de la autenticación es probablemente el * único * caso en que algo como esto tendría sentido, e incluso allí, buscaría un enfoque diferente. Ciertamente no tiene sentido en el contexto en el que se formuló la pregunta. –

Respuesta

7

La comunicación entre controladores en una aplicación Rails (o cualquier aplicación web que siga el mismo modelo de adaptador-vista para el caso) es algo que debe evitar activamente. Cuando esté tentado de hacerlo, considérelo una señal de que está luchando contra los patrones y el marco en el que se basa su aplicación y de que se basa en la lógica que se ha implementado en la capa incorrecta de su aplicación.

As @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, este es a menudo un método en un objeto modelo, especialmente para el tipo de comportamiento de creación del que pareces estar preocupado en este caso.

3

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

Por ejemplo si va a crear una Persona:

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

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

A continuación, en la Persona-modelo que podría ir como esto:

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 puede ayudar un poco. :-)

+1

¿Qué sucede si desea redirigir a otra 'acción:: crear' para que pueda crear otro modelo? – mbigras

Cuestiones relacionadas