Zajmuję się tworzeniem strony internetowej Rails 2.3.1. W całej witrynie potrzebuję formularza do tworzenia postów na różnych stronach (strona główna, strona tworzenia postów, strona z listą wpisów, strona z komentarzami itp. - wystarczy powiedzieć, że ten formularz musi znajdować się na wielu stronach obsługiwanych przez wiele kontrolerów). Każda z tych stron wyświetla wiele innych informacji, które są pobierane w odpowiednim kontrolerze/akcie. Ex, strona główna zawiera listę 10 najnowszych wpisów, treść pobraną z bazy danych itp.Najlepsze praktyki dotyczące szyn dla tego samego formularza na wielu stronach
Przesunąłem więc formularz tworzenia postów do częściowej, i uwzględniłem to częściowe na wszystkich niezbędnych stronach. Zauważ, że formularz w częściowych testach POST do/pytania (które trasy do PostsController :: create - jest to zachowanie domyślne rails).
Problem, na który napotykam, to fakt, że formularz Posty nie jest poprawnie wypełniony, domyślnie PostsController :: create renderuj metodę pytania/new.html.erb, nawet jeśli formularz został przesłany ze strony głównej (/ home/index.html.erb).
Próbowałem zmienić formularz w częściowym, aby przesłać "submitting_controller" i "submining_action", a także w PostsController :: create, when @ post.save? == false, wyświetlam action => "../submitting_controller/submitting_action" (co jest nieco hackowskie, ale pozwala na renderowanie akcji z nie-PostScriptera).
Wydawało się, że działa dobrze na powierzchni. Niekompletna forma została wyświetlona w widoku, który przesłał go ze wszystkimi poprawnymi komunikatami @ post.errors, itp. Problemem było WSZYSTKIE inne dane na stronach, które się pojawiły, ponieważ rzeczywiste metody submitting_controller/submitting_action nie były wywoływane, tylko powiązany widok. (Remeber, zrobiłem render, który zachowuje obiekty instancji, a nie przekierowanie, które nie zachowuje obiektu instancji @post, który ma wszystkie komunikaty o błędach i przesłane wartości.)
O ile widzę, mam dwie opcje :
1) Czy mogę przechowywać obiekt @post w sesji, gdy @ post.save? kończy się niepowodzeniem w PostsController :: create, redirect_to submitting_controller/submitting_action, w tym momencie wyciągam obiekt @post z sesji i używam go do ponownego wypełnienia formularza/komunikatów o błędach. (O ile rozumiem, przechowywanie obiektów w sesji to ZŁE praktyki w szynach)
2) Potrafię przenieść całą logikę używaną do wyciągania danych z formularzy kreacji niezwiązanych z postów z różnych submitting_controller/submision_action, umieść go w ApplicationController, stwórz gigantyczną instrukcję switch w PostsController :: create dla submitting_controller/submitting_action i wywołaj metody w ApplicationController, aby pobrać wszystkie dodatkowe dane potrzebne do renderowania każdej strony.
Myśli o najlepszym sposobie zrobienia tego w Railsach?
Emfi, Niezły punkt dotyczący atrybutów zagnieżdżonych. To nie przyszło mi do głowy. Ważna jest również kwestia, która dotyczy kwestii niewykonania zobowiązań przez JS. Mam jednak wrażenie, że pytający (z powodu braku lepszego uchwytu) w końcu zrani wydajność aplikacji poprzez ilość akcji DB, którą będzie musiał wykonać, odtwarzając wszystkie obiekty. – robertpostill
Na tym jesteśmy zgodni. Jednak różnica między nie-javascript i AJAX jest zazwyczaj połączeniem link_to_remote, RJS, który renderuje szablon i prawdopodobnie małą logiką kontrolera, aby uniknąć wywołań bazy danych, które normalnie byś zrobił inaczej. – EmFi
EmFi, Niestety model Posta i modele, których kontroler, którego będziesz używać do renderowania formularza, mogą nie być powiązane. (HomeController nie ma nawet modelu podkładu). Robię pewne sprawdzanie mechanizmu captcha w PostController :: create (pole captcha nie jest częścią Post Modelu, a raczej jego własnym modułem). Myślę, że zarówno ty, jak i Robertpostill macie rację w AJAX, jest sposobem na rozwiązanie tego problemu.Po prostu muszę wymyślić, jak to zrobić z jQuery (zrezygnowałem z używania Prototype, personal pref) i nie zbieram niczego w Railsach. – empire29