Rails Model, widok, kontroler i Pomocnik: co idzie gdzie?

W Ruby on Rails Development (lub ogólnie MVC), jaką szybką regułę powinienem zastosować, gdzie umieścić logikę.

Proszę odpowiedzieć twierdząco-za pomocą proszę umieścić to tutaj , a nie nie umieszczać tego tam .

Author: Theo, 2008-09-13

10 answers

MVC

Controller : Umieść tutaj kod, który ma związek z ustaleniem, czego chce użytkownik, i decydowaniem, co ma mu dać, sprawdzaniem, czy jest zalogowany, czy powinien zobaczyć określone dane, itp. Na koniec kontroler analizuje żądania i ustala, jakie dane (modele) mają być wyświetlane i jakie widoki mają być renderowane. Jeśli masz wątpliwości, czy kod powinien wejść do kontrolera, to prawdopodobnie nie powinien. Zachowaj swoje Kontrolery .

Widok : Widok powinien zawierać tylko minimalny kod do wyświetlania danych (modelu), nie powinien dużo przetwarzać ani obliczać, powinien wyświetlać dane obliczone (lub podsumowane) przez Model lub wygenerowane z kontrolera. Jeśli Widok naprawdę wymaga przetwarzania, którego nie może wykonać Model lub kontroler, umieść kod w Helperze. Wiele kodu Ruby w widoku sprawia, że znaczniki stron są trudne do odczytania.

Model : twój model powinien być tam, gdzie wszystkie twój kod, który odnosi się do Twoich danych (podmiotów, które tworzą Twoją witrynę, np. użytkowników, postów, kont, znajomych itp.) żyje. Jeśli kod wymaga zapisania, aktualizacji lub podsumowania danych związanych z Twoimi podmiotami, umieść go tutaj. Będzie można go ponownie wykorzystać w widokach i kontrolerach.

 167
Author: pauliephonic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 14:48:56

Aby dodać do odpowiedzi pauliephonic:

Helper : funkcje ułatwiające tworzenie widoku. Na przykład, jeśli zawsze powtarzasz listę widżetów, aby wyświetlić ich cenę, umieść ją w helperze (wraz z częściową dla rzeczywistego wyświetlania). Lub jeśli masz kawałek RJS, który nie chcesz zaśmiecać widoku, włóż go do pomocnika.

 33
Author: jcoby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-11 22:35:43

Wzorzec MVC dotyczy tylko interfejsu użytkownika i nic więcej. Nie należy umieszczać skomplikowanej logiki biznesowej w kontrolerze, ponieważ kontroluje on widok, ale nie logikę. Kontroler powinien zająć się wyborem właściwego widoku i delegować bardziej złożone rzeczy do modelu domeny (modelu) lub warstwy biznesowej.

Domain Driven Design ma koncepcję usług, która jest miejscem, w którym można umieścić logikę, która wymaga uporządkowania wielu różnych typów obiektów, które ogólnie oznacza logikę, która nie należy naturalnie do klasy modelowej.

Ogólnie uważam warstwę usług za API moich aplikacji. Moje warstwy usług zazwyczaj map dość ściśle do wymagań aplikacji jestem tworzenia, więc warstwa usług działa jako uproszczenie bardziej złożonych interakcji znalezionych w niższych poziomach mojej aplikacji, czyli można osiągnąć ten sam cel omijając warstwy usług, ale trzeba pociągnąć o wiele więcej dźwigni, aby to zrobić praca.

Zauważ, że nie mówię tutaj o szynach, mówię o ogólnym stylu architektonicznym, który rozwiązuje twój konkretny problem.

 13
Author: Søren Spelling Lund,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-13 16:59:40

Doskonałe wyjaśnienie już tutaj, jedno bardzo proste zdanie jako wniosek i łatwe do zapamiętania:

Potrzebujemy inteligentnych modeli, cienkich kontrolerów i głupich widoków.

Http://c2.com/cgi/wiki?ModelViewController

 10
Author: maddin2code,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-25 09:01:14

Sposób Rails jest mieć chudy kontrolery i grube modele.

 7
Author: John Topley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-13 17:52:26

Umieść w kontrolerze rzeczy związane z autoryzacją/kontrolą dostępu.

Modele to wszystko o Twoich danych. Walidacja, relacje, CRUD, logika biznesowa

Widoki są o wyświetlanie danych. Wyświetlanie i pobieranie tylko danych wejściowych.

Kontrolery służą do kontrolowania, jakie dane przechodzą z modelu do widoku (i który Widok) oraz z widoku do modelu. Kontrolery mogą również istnieć bez modeli.

Lubię myśleć o kontrolerze jako o bezpieczeństwie strażnik / recepcjonista, który kieruje klienta(zapytanie) do odpowiedniego licznika, gdzie zadajesz pytanie kasjerowi (widok). Kasjer (widok) następnie idzie i dostaje odpowiedź od menedżera (model), którego nigdy nie widzisz. Ty wniosek następnie wrócić do ochroniarza / recepcjonisty (kontroler) i czekać, aż zostaniesz skierowany do innego kasjera (widok), który powie Ci odpowiedź kierownik (model) powiedział im w odpowiedzi na pytanie innego kasjera (widok).

Podobnie jeśli chcesz powiedz kasjerowi (widok) coś wtedy w dużej mierze dzieje się to samo, z wyjątkiem drugiego kasjera powie Ci, czy menedżer zaakceptował Twoje informacje. Możliwe jest również, że ochroniarz/Recepcjonista (kontroler) mógł powiedzieć ci, abyś poszedł na wycieczkę, ponieważ nie byłeś upoważniony do przekazania tej informacji kierownikowi.

Aby rozszerzyć metaforę, w moim stereotypowym i nierealnym świecie kasjerzy (poglądy) są ładni, ale pustogłowie i często wierzą we wszystko, co im powiesz, ochroniarze / recepcjoniści są minimalnie uprzejmi, ale nie mają zbyt dużej wiedzy, ale wiedzą, gdzie ludzie powinni i nie powinni iść, a menedżerowie są naprawdę brzydcy i złośliwi, ale wiedzą wszystko i mogą powiedzieć, co jest prawdą, a co nie.

 7
Author: srboisvert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 12:59:23

Jedną z rzeczy, która pomaga w prawidłowym oddzieleniu jest unikanie "przekazywania zmiennych lokalnych z kontrolera do widoku" anty-pattern. Zamiast tego:

# app/controllers/foos_controller.rb:
class FoosController < ApplicationController

  def show
    @foo = Foo.find(...)
  end

end

#app/views/foos/show.html.erb:
...
<%= @foo.bar %>
...

Spróbuj przenieść go do gettera, który jest dostępny jako metoda pomocnicza:

# app/controllers/foos_controller.rb:
class FoosController < ApplicationController

  helper_method :foo

  def show
  end

  protected

  def foo
    @foo ||= Foo.find(...)
  end

end

#app/views/foos/show.html.erb:
...
<%= foo.bar %>
...

Ułatwia to modyfikowanie tego, co jest umieszczane w "@foo" i jak jest używane. Zwiększa to separację między kontrolerem a widokiem bez komplikowania ich.

 4
Author: James A. Rosen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 14:54:19

Cóż, to zależy od tego, z czym ma do czynienia logika...

Często sensowne jest wpychanie większej ilości rzeczy do modeli, pozostawiając Kontrolery małe. Zapewnia to, że ta logika może być łatwo używana z dowolnego miejsca, aby uzyskać dostęp do danych reprezentowanych przez model. Widoki nie powinny zawierać prawie żadnej logiki. Tak naprawdę, ogólnie rzecz biorąc, powinniście dążyć do tego, aby się nie powtarzać.

Również szybki kawałek google ujawnia kilka bardziej konkretnych przykładów tego, co idzie gdzie.

Model: wymagania walidacyjne, relacje danych, tworzenie metod, aktualizowanie metod, niszczenie metod, znajdowanie metod (zauważ, że powinieneś mieć nie tylko ogólne wersje tych metod, ale jeśli jest coś, co robisz dużo, jak znajdowanie ludzi z rudymi włosami po nazwisku, powinieneś wyodrębnić tę logikę, aby wszystko, co musisz zrobić, to wywołać find_redH_by_name ("smith") lub coś w tym stylu)

Widok: tu powinno być wszystko o formatowaniu danych, a nie przetwarzanie danych.

Kontroler: tutaj odbywa się przetwarzanie danych. Z Internetu: "celem administratora jest odpowiedź na żądane przez użytkownika działanie, pobranie dowolnych parametrów ustawionych przez użytkownika, przetwarzanie danych, interakcja z modelem, a następnie przekazanie żądanych danych w ostatecznej formie do widoku."

Mam nadzieję, że to pomoże.

 2
Author: Paul Wicks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-13 16:33:54

W prostych słowach, ogólnie, Modele będą miały wszystkie kody związane z tabelami, ich prostymi lub złożonymi relacjami( potraktuj je jako zapytania sql obejmujące wiele tabel), manipulacją danymi/zmiennymi w celu uzyskania wyniku za pomocą logiki biznesowej.

Kontrolery będą miały kod / wskaźniki w kierunku odpowiednich modeli dla żądanego zadania.

Views zaakceptuje wejście/interakcję użytkownika i wyświetli wynikową odpowiedź.

Any duże odchylenie od nich spowoduje niepożądane obciążenie tej części i może mieć wpływ na ogólną wydajność aplikacji.

 0
Author: Anutosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-01 15:43:58

Testowanie, Testowanie ... Umieść jak najwięcej logiki w modelu, a następnie będziesz mógł przetestować go poprawnie. Testy jednostkowe testują Dane i sposób ich tworzenia poprzez testowanie modelu, a testy funkcjonalne testują sposób, w jaki są one kierowane lub kontrolowane przez testowanie sterowników, więc wynika z tego, że nie można przetestować integralności danych, chyba że są one w modelu.

J

 -1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-03 07:39:38