FormObject

hejka jestem początkująca w ruby on rails i muszę wykorzystać w swoim projekcie FormObject niestety z stron internetowych za bardzo tego nie rozumiem.

Fajnym wprowadzeniem jest ten RailsCast (niestety płatny):

http://railscasts.com/episodes/416-form-objects

@Katrina, sprawa jest bardzo prosta. Typowo railsowe podejście to budowanie formularzy które niejako mapują się 1:1 do modelu (co w większości przypadków jest jak najbardziej ok). Niestety czasem zdarza się, że to co pokazujemy użytkownikowi nie do końca mapuje się na nasz model/modele. Wtedy zamiast hackować model tworzymy zupełnie osobną klasę, która będzie zajmować się logiką tego konkretnego formularza. Taka klasa może mieć jakieś customowe walidacje (np. potwierdzenie, że “tak jestem pełnoletni”, chociaż nigdzie tego nie zapiszemy w bazie) i swoją logikę (np. tworzyć odpowiedni obiekt gdy wszystkie dane są ok). Kontroler w takim przypadku przestaje rozmawiać bezpośrednio z modelem (lub co gorsza z wieloma modelami), teraz robi to z odpowiednim form objectem.

Co do przykładów:

Jak sobie poczytasz o tym patternie i lepiej go zrozumiesz to polecam zacząć od czegoś najprostszego (zwykłe PORO):

class MyForm
  def initialize(params)
    # ..
  end

  # inne metody
end

9$, a baza wiedzy przeogromna, więc nawet nie ma się nad czym zastanawiać.

te railscasty to dobry przykład, ale ja bym rozwały, przeniesienie tego co jest w metodzie submit, save, … FormObject do osobnego ServiceObject, wtedy taki service object można użyć w innym miejscu. FormObject użył bym tylko do otrzymania danych z formularza i walidacji a manipulację na danych (bazie danych) dokonałbym w osobnej klasie. Na początek może się to wydać dalekie od Rails Way, ale w większych projektach sprawdza się to bardzo dobrze.

To jest bardzo dobry pomysł ale dopiero kiedy pojawia ci się w projekcie owo “inne miejsce”. Nie wcześniej.

lub gdy w metodzie save, submit, … tworzysz/zapisujesz wiele obiektów, dużo przejrzyściej jest to przenieść do osobnej klasy. Form Object służy tylko do obsługi formularza a nie do obsługi tworzenia rekordów. Ale oczywiście dzielenie kodu na podklasy trzeba wykonać z głową, bo dla jednej linijki nie opłaca się tworzyć osobnej klasy.

1 Like

Dokładnie. Na początku tworzyłem właśnie klasy, które i obsługiwały walidację atrybutów, i wykonywały jakieś operacje na obiektach i atrybutach oraz zapisywały rekordy w bazie. Szybko robił się bałagan, a w przypadku, kiedy form object zajmuje się atrybutami i tylko nimi, to (wydaje mi się) łatwiej taki kod ogarnąć.

Obecnie korzystam z “Form Objectów” nawet tam, gdzie nie mam do czynienia z formularzem, ale gdzie chcę mieć pewność, że pracuję z poprawnymi danymi. Virtus jest tutaj bardzo pomocny (chociaż miejscami trzeba stosować małe obejścia).

W Rails 4 Virtus nad ActiveModel ma jedynie tą przewagę, że rzutuje wartości na określony typ danych. ActiveModel ma natomiast walidację, której Virtus nie posiada.

To jest dla mnie bardzo duża zaleta :wink:

include Virtus.model
include ActiveModel::Conversion
include ActiveModel::Validations

extend ActiveModel::Naming

Ja nie dawno zacząłem używać ActiveType do form objectów - zarówno dla tych, którę dają się mapować się na modele jak i nie. W Active type jest też to fajne, że wszystkie form objecty mają wspólny interfejs.

Ja własnie czytam Growing Rails applications in practice napisaną przez autorów ActiveType. Krótka książka bez zbędnego lania wody. Pokazują różne usprawnienia które wykonywali w swoich projektach railsowych. Wspominają w niej właśnie o Active Type i wyglądało to bardzo przekonująco. Fajnie słyszeć że ktoś tego używa i jest zadowolony. Myślę że w takim razie może skuszę się żeby wypróbować go w swoim projekcie :slight_smile:

Ha! Ja właśnie o tym gemie usłyszałem z tej książki - swoją drogą polecam. Jedna z lepszych książek o Railsach ostatnimi czasy.

Dzięki za pomoc :slight_smile:

Ciekawe wygląda https://github.com/apotonick/reform jako podejście do FormObject.

jeśli chodzi o railscasty jeszcze to od jakiegoś czasu jest promocja tego typu, że płacisz 9$ i masz nielimitowany dostęp do wszystkich materiałów do odwołania :wink: Tzn. prawdopodobnie do momentu kiedy Mr Ryan reaktywuje railscasts.com z nowymi materiałami, które od jakiegoś czasu się niestety nie pojawiają.