2014-09-09 19 views
6

Nadpisuję działanie create kontrolera rejestracji. Mam dwie formy rejestracji, osoby lub firmy, firma ma pole o nazwie company_form ustawione na true, które rozróżnia dwie formy.Rails render części i layout w kontrolerze

Po sprawdzeniu poprawności formularza chciałbym renderować poprawny formularz (poprzednio powracał do domyślnego formularza bez względu na to, z jakiego formularza korzystałem).

Mam problem, w którym renderowany jest tylko częściowy obraz (oczywiste, ponieważ renderuję tylko częściowe), ale potrzebuję również, aby układ/plik aplikacji był renderowany.

class RegistrationsController < Devise::RegistrationsController 
    def create 
    <!-- Other devise code here --> 
    if resource.company_form 
     render partial: 'shared/company_signup_form' 
    else 
     render partial: '/shared/individual_signup_form' 
    end 
    end 
end 

Próbowałem

if resource.company_form 
    render partial: 'shared/company_signup_form', layout: 'layouts/application' 
    else 
    render partial: '/shared/individual_signup_form', layout: 'layouts/application 
    end 

Ale pojawia się błąd

Template is missing 
Missing partial layouts/_application 

Dlaczego szukasz częściowego _application kiedy określony układ i jak mogę uzyskać prawidłowy układ do należy zastosować

Dziękujemy

Edit

Czytając dokumentację mówi

„Należy pamiętać, że układy do partials podążać tą samą wiodące podkreślenia nazywania jako regularne partials i są umieszczone w tym samym folderze z częściową, że należą one do (nie w folderze wzorcowym). "

ale chcę Domyślny układ należy stosować

+0

układy/aplikacja przypuszczać, aby uruchomić dla wszystkich częściowego lub dowolnej strony państwa są renderingu, to mistrz strona modułu widoku. Jeśli chcesz mieć inny układ dla dwóch różnych sytuacji, możesz napisać jeden warunek w kontrolerze aplikacji. –

+0

. To jest właśnie to, czego chcę, aby renderować układ główny, ale nie robi to – Richlewis

+0

http://api.rubyonrails.org/classes/ActionView /PartialRenderer.html użyj tego dla ref, może to rozwiąże twój problem –

Odpowiedz

5

Częściowy renderowania w kontroler jest najczęściej stosowany razem z Ajax wzywa że tylko aktualizuje jeden lub kilka elementów na stronie bez przeładowywania. Renderowanie części z kontrolera umożliwia użycie tego samego szablonu częściowego zarówno w renderowaniu całej strony (przez wywołanie go z poziomu szablonu), jak i podczas aktualizacji podstrony (z działania kontrolera odpowiadającego na wywołania Ajax). Domyślnie bieżący układ nie jest używany.

To może być powód, dla którego twój kod nie działa, możesz użyć szablonu renderowania.

Renderowanie szablonów działa tak samo jak renderowanie akcji, z tym wyjątkiem, że pobiera ścieżkę względem głównego szablonu. Bieżący układ zostanie zastosowany automatycznie.

if resource.company_form 
    render :template => "shared/company_signup_form" 
else 
    render :template => "shared/individual_signup_form" 
end 

** USUNĄĆ podkreślenia od nazwy partail ponieważ używasz tego jako szablon.

Mam nadzieję, że to działa!

+0

niestety nie, układy/aplikacja zostanie wyrenderowana dwa razy i częściowa nie będzie renderowana wcale – Richlewis

+0

sprawdź edytowaną odpowiedź, mam nadzieję, że to zadziała dla ciebie –

+0

Dzięki, dowiedziałeś się czegoś nowego o szablonach dzisiaj, twoja odpowiedź działa i jest o wiele bardziej wydajne i bardziej "The Rails way" – Richlewis

2

W końcu (a wiem, że to jest hack), ale stworzył częściowej nazwie _partial_layout_wrapper w moich układów który był dokładną kopią układy/pliku aplikacji i używane w moim kontrolera

render partial: 'shared/company_signup_form', layout: 'partial_layout_wrapper' 

to działa, ale na pewno nie może tak być?

1

Czy mógłbyś opublikować swój kontroler? Railsy renderują domyślnie layout/application.html.erb, jeśli nie określono innego layoutu.

z prowadnic ROR:

cząstkowe układy

Częściowa można użyć własnego pliku layoutu, tak jak widok może wykorzystywać układ . Na przykład, można nazwać częściowy tak:

<%= render partial: "link_area", layout: "graybar" %> 

to będzie wyglądać do częściowego nazwie _link_area.html.erb i uczynić go pomocą _graybar.html.erb układu. Zwróć uwagę, że układy częściowe mają tę samą wiodącą nazwę podkreślenia, co zwykłe części, i są umieszczone w tym samym folderze z częściowym, do którego należą (nie w folderze wzorców).

Należy również zauważyć, że jawne określenie: częściowe jest wymagane przy przekazywaniu dodatkowych opcji, takich jak: układ.

Więc render partial: 'shared/company_signup_form', layout: 'layouts/application' szuka układy/_application.html.erb

Powiązane problemy