2009-01-23 12 views
24

Mam dwa kontrolery dla dwóch odpowiednich modeli, według przykładów, zdjęć i kategorii. metody indeksowania i wyświetlania są bardzo podobne w każdym kontrolerze, a widoki są identyczne. Jaka jest najlepsza metoda udostępniania widoku przez dwa modele?Dwa kontrolery dla jednego widoku współdzielonego w Ruby on Rails

choć mam dwie opcje:

  • Użyj pomocnika. W helperie wstawi kod widoku i wywoła helpera z każdego widoku (zdjęcia/widoki i kategorie/widoki).

  • Użyj częściowego w każdym widoku. Myślę, że jest to bardziej czyste rozwiązanie, ale widzę, jak ogromny DRY jest w moim umyśle, kiedy zamierza zakodować to rozwiązanie.

Tak, mam dwa kontrolery z dwóch modeli, każdy dzień i naraża obiekt @photo (foto kontrolera ze wszystkimi zdjęciami i kategorie kontrolera ze zdjęciami tylko zaznaczone Kategoria) i muszę jeden widok na pokaż oba.

Poszukuję eleganckiego rozwiązania dla tego, narzekającego na REST i DRY principes. Dowolny pomysł?

Z góry dziękuję.

Odpowiedz

38

Mam podobną sytuację z jednym z moich projektów. Wszystkie widoki usuwania dla większości kontrolerów są stylizowane w ten sam sposób, wyświetlają te same pola potwierdzenia i po prostu renderują przewidywalne wyświetlanie dowolnego obiektu, który jest usuwany.

Rozwiązanie było dość proste i eleganckie w mojej opinii. Mówiąc prościej, stworzyliśmy nowy katalog app/views o nazwie shared i umieściliśmy tam widoki wspólne. Mogą to być pełne pliki szablonów lub tylko częściowe.

Proponuję użyć wspólnego szablonu (w kategoriach ani katalogów widoku zdjęć, ale raczej w katalogu współdzielonym) i renderowania go ręcznie z widoku.

np. mieć metodę jako takie w obu kontrolerów oraz plik app/views/shared/photo.html.erb:

def show 
    @photo = Photo.first # ... or whatever here 
    render :template => 'shared/photo' 
end 

Powinno to skutecznie uczynić wspólny szablon. Jest to DRUGA trasa i nie ma poczucia zanieczyszczenia, które uzyskujesz, gdy używasz bardziej lub mniej pustego widoku w katalogu widoków każdego kontrolera, aby dołączyć część wspólną, ponieważ rozumiem, że twoje pytanie sugeruje.

+0

Ah genialny! Spędziłem 2 godziny próbując wykończyć jedną z moich częściowych spraw, która powodowała mój smutek. Dziękuję - to takie proste. – brad

+0

Co się dzieje, gdy trzeba wczytać ten szablon za pomocą AJAX? :) – Noz

+0

Kiedy próbuję tego w Railsach 4.2.5 pojawia się błąd "ActionController :: RackDelegation # content_type delegowany do @ _response.content_type, ale @_response jest zerowe: #

1

Użyłbym pomocnika, ponieważ są one dzielone między widokami. W przypadku części HTML używałbym częściowych, więc byłaby to mieszanka obu sposobów.

+0

Tak, myślę, że jest to najlepsze rozwiązanie ze względu na widoczność z każdego kontrolera lub widoku, ale czy jest właściwe umieszczanie kodu widoku (kodu html) w pomocniku? – ARemesal

+0

Lepiej nie umieszczać kodu widoku w pomocnikach, chyba że jest to mniej niż kilka linii. –

+0

Użyłbym kombinacji częściowego kodu HTML i pomocników dla kodu. – Keltia

6

O first odpowiedź:

Jeśli cząstkowe muszą być świadczone z myślą:

 
<%= render :partial => "shared/photo" %> 

i częściowego musi być w app/views/shared/_photo.html.erb

1

Wygląda to na dobry użytek z klejnotu Cells.

0

@bjeanes Jeśli wszystkie twoje wyświetlenia usunięć są takie same, możesz utworzyć widoki/default/delete.html.erb i wszystkie działania usuwania będą z niego korzystać.

To co robię: Większość moich poglądów są na domyślne, a ja stworzenie konkretnych te tylko w razie potrzeby

Aktualizacja: Ok, ten post jest z 2009 roku, tak, będę trzymać mój komentarz tutaj Sprawa, którą ktoś dostaje od Google, tak jak ja.