2012-05-14 18 views
6

To zabrzmi dziwnie, ale wysłuchaj mnie ... Muszę być w stanie wysłać równoważnik żądania POST do jednego z moich innych kontrolerów. SimpleController jest w zasadzie uproszczoną wersją bardziej szczegółowego kontrolera. Jak mogę to zrobić właściwie?Railsy: Jak POST wewnętrznie przejść do innej akcji kontrolera?

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 

Być może zbytnio to sobie myślę, ale nie wiem, jak to zrobić.

+1

czy na pewno tego potrzebujesz? Czy nie byłoby bardziej odpowiednie, aby mieć verbose create jako metodę Model? –

+5

To świetnie, że wszyscy mówią, że nie powinno się tego robić, ale czasami trzeba to zrobić. Na przykład, aby przywrócić dane POST po uwierzytelnieniu, itp. –

+0

@TheDoctorJak przywracanie danych POST po uwierzytelnieniu jest prawdopodobnie jedynym przypadkiem, w którym coś takiego miałoby sens, a nawet tam, szukałbym innego podejścia. Z pewnością nie ma to sensu w kontekście, w którym zadano pytanie. –

Odpowiedz

7

Komunikacja między kontrolerami w aplikacji Rails (lub dowolnej aplikacji internetowej zgodnej z tym samym wzorcem modelu adaptera) jest czymś, czego należy aktywnie unikać. Kiedy masz ochotę to zrobić, zastanów się nad tym, że walczysz ze wzorami i ramami, w których twoja aplikacja jest zbudowana i że polegasz na logice, została zaimplementowana na niewłaściwej warstwie twojej aplikacji.

Jak zasugerował @ismaelga w komentarzu; oba kontrolery powinny wywoływać niektóre wspólne komponenty, aby obsłużyć to wspólne zachowanie i utrzymywać kontrolerów "chudych". W Railsach, które są często metodą na obiekcie modelu, szczególnie w przypadku tego rodzaju zachowań twórczych, wydaje się, że w tym przypadku martwisz się.

3

Nie powinieneś tego robić. Czy tworzysz model? Wtedy posiadanie dwóch metod klasowych na modelu byłoby znacznie lepsze. Oddziela również kod znacznie lepiej. Następnie możesz użyć metod nie tylko w kontrolerach, ale także w tle (itp.) W przyszłości.

Na przykład, jeśli tworzysz osobę:

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

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

Następnie w osobie model można iść tak:

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 

Mam nadzieję, że to może pomóc trochę. :-)

+1

Co jeśli chcesz przekierować do innej 'akcji:: create', abyś mógł stworzyć inny model? – mbigras

Powiązane problemy