Muszę wywołać akcję tworzenia w kontrolerze A, z kontrolera B.
Powodem jest to, że muszę przekierować inaczej, gdy dzwonię z kontrolera B.
Czy można to zrobić w Railsach?
ruby-on-rails
ddayan
źródło
źródło
Odpowiedzi:
Możesz użyć przekierowania do tej akcji:
Więcej na: Przewodnik po Railsach
Aby po prostu wyrenderować nową akcję:
źródło
render
zamiastredirect_to
. Co powiesz, @Spyros?redirect_to
nie pozwala na użyciepost: :method
i może to być przydatne szczególnie w przypadku przekierowania do już istniejącejcreate
akcji innego kontrolera, o co @ddayan zapytał za pierwszym razem. Mam podobną sytuację, w której w jakiejś sytuacji powinienem stworzyć kolejny obiekt. Wywołanie drugiejcreate
akcji może być DRYer ..Aby użyć jednego kontrolera od innego, wykonaj następujące czynności:
źródło
controller_you_want
, zrobiłbyś tocontroller_you_want.process(:action_you_want)
render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)
wydaje się działać, aby zwrócić JSON z innego kontroleracontroller_you_want.request
ale nie udało się uzyskać tego odpalenia, przekazując instancję skrótu lub parametrów.params
się dostępnecontroller_you_want
, ustawiającrequest
w trzeciej linii. Czy o to pytasz?render html: controller_you_want.process(:action_you_want)
Logika, którą prezentujesz, nie jest zgodna z MVC, a następnie z Railsami.
Kontroler renderuje widok lub przekierowuje
Metoda wykonuje kod
Na podstawie tych rozważań radzę utworzyć metody w kontrolerze i wywołać je z akcji.
Przykład:
To powiedziawszy, możesz zrobić dokładnie to samo za pomocą różnych kontrolerów i przywołać metodę z kontrolera A, gdy jesteś w kontrolerze B.
Słownictwo jest niezwykle ważne, dlatego bardzo nalegam.
źródło
get_variable
teraz wywołać z innego kontrolera?Możesz użyć,
url_for
aby uzyskać adres URL kontrolera i akcji, a następnie użyć,redirect_to
aby przejść do tego adresu URL.źródło
redirect_to url_for(:controller => :controller_name, :action => :action_name, :param1 => :val1, :param2 => :val2)
spowoduje/contorller_name/action_name?param1=val1¶m2=val2
. Zobacz dokumentacjęWywoływanie innej akcji kontrolera jest złą praktyką.
Powinieneś
Moja opinia:
Trzecie podejście jest tym, co często robiłem. Więc pokażę mały przykład.
Możesz więc wysłać do tego
redirect_to
parametru akcji , którym może być dowolna ścieżka.źródło
/models
lub zwykłej klasy lub modułu w/lib
). Jedynym problemem jest to, że kontroler komunikuje się z widokiem za pośrednictwem zmiennych instancji - musisz naprawić tę duplikację w inny sposób.Może logikę można by wydobyć z pomocnika? pomocnicy są dostępni dla wszystkich klas i nie przekazują kontroli. Możesz sprawdzić w nim, być może nazwę kontrolera, aby zobaczyć, jak został wywołany.
źródło
Kompozycja na ratunek!
Biorąc pod uwagę przyczynę, zamiast wywoływać akcje między kontrolerami, należy zaprojektować kontrolery, aby oddzielić wspólne i niestandardowe części kodu. Pomoże to uniknąć zarówno duplikowania kodu, jak i łamania wzorca MVC.
Chociaż można to zrobić na wiele sposobów, dobrą praktyką jest stosowanie obaw ( składu ).
Mam nadzieję, że to pomoże.
źródło
Możesz wywołać inną akcję wewnątrz akcji w następujący sposób:
redirect_to action: „action_name”
źródło
Oddziel te funkcje od kontrolerów i umieść je w pliku modelu. Następnie dołącz plik modelu do kontrolera.
źródło