Mam następujący dylemat.
Utworzyłem dwa modele danych
parent (z opcą has_many :childs) i
child (z opcją beolngs_to :parent)
Używając:
rails g scaffold Child .....
RoR domyślnie generuje m.in formularze, controllery i w /config/route.rb wstawia wpis:
resources :childs
Zgodnie z przykładem omawianym w serii:
(dokładnie film: https://www.youtube.com/watch?v=HVuawlZTLBw&index=29&list=PLgYiyoyNPrv-j6vFyXP8mgRyvpRqFkjb8 )
przeniosłem folder /app/views/childs do katalogu rodzica, czyli /app/views/parents/childs i zmodyfikowałem je zgodnie z instrukcjami
Zgodnie z instrukcjami utworzyłem w app/controllers folder parents i przeniosłem do niego childs_controller.rb.
Zmodyfikowałem także zawartość tego app/controllers/parents/childs_controller.rb.
dokonując wpisów wg wskazówek z filmu.
Musiałem także zmienić zawartość /config/route.rb.
resources :parents do
resources :childs, excpt: [:index], controller: 'parents/childs'
end
Wszystko gra i buczy jak w przykładzie. SUPER!
…Ale zachciało mi się wyświetlać i listować “dzieci” nie tylko poprzez formularz rodzica,
ale także listując wszystkie dzieci i dodawać nowe pozycje, edytować (dodając na formularzu f.select Parent.all …)
No i pojawia się pierwszy “zgryz”
Nie mogę listować http://127.0.0.1:3000/childs, bo nie ma takiej ścieżki routingu.
Zmieniam zatem route.rb i mam teraz wpisy:
resources :childs, controller: 'parents/childs'
resources :parents do
resources :childs, excpt: [:index], controller: 'parents/childs'
end
i listowanie bezpośrednio “dzieci” już działa ale sięga do kotrolera parentss/childs’, który jest przecież zmodyfikowany!
Podobnie wywołuje formularze z app/views/parents/childs, które zmodyfikowane zostały na potrzeby wywołań z okna rodzica!
np. “_form.html.erb”
<%= form_for [@parent, @child] do |f| %>
a było przecież:
<%= form_for (@child) do |f| %>
Pytanie jakie mam do praktyków, którzy już na niejednym projekcie zęby stępili.
Jak powinno się prawidłowo postępować, tj …
- Czy należy tworzyć dwa kontrolery (app/controllers/parents/childs_controller.rb. i app/controllers/childs_controller.rb.), by obsługiwać raz “dzieci”, które dodajemy/usuwamy/modyfikujemy z okna rodzica, a innym razem bezpośrednio?
- Czy należy tworzyć osobno /app/views/parents/childs/* i drugi zestaw /app/views/childs/* ?
- A może należy stosować
if
-y i mieć jeden kontroler i jeden zestaw widoków, który będzie różnie działał w zależności od tego, czy obsługujemy dzieci bezpośrednio, czy za pośrednictwem formularzy rodzica?
Wdzięczny będę za wskazówki, bo ucząc się nie chciałbym ani sięgać lewą ręką do prawej kieszeni, ani złych nawyków w sobie wyrabiać.