Szyny moje poglądy i kontrolery są zaśmiecone redirect_to
, link_to
i form_for
wywołań metod. Czasami link_to
i redirect_to
są jawne w ścieżkach, które łączą (np. link_to 'New Person', new_person_path
), Ale często ścieżki są niejawne (np link_to 'Show', person
.).
Dodaję dziedziczenie pojedynczej tabeli (STI) do mojego modelu (powiedzmy Employee < Person
) i wszystkie te metody przestaną działać dla instancji podklasy (powiedzmy Employee
); gdy railsy są wykonywane link_to @person
, wyświetla błędy undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
. Railsy poszukują trasy zdefiniowanej przez nazwę klasy obiektu, którym jest pracownik. Te trasy pracowników nie są zdefiniowane i nie ma kontrolera pracowniczego, więc akcje też nie są zdefiniowane.
To pytanie zostało już zadane:
- W StackOverflow odpowiedzią jest edycja każdego wystąpienia link_to itp. W całej bazie kodu i jawne określenie ścieżki
- W StackOverflow ponownie dwie osoby sugerują użycie
routes.rb
do mapowania zasobów podklasy na klasę nadrzędną (map.resources :employees, :controller => 'people'
). Najlepsza odpowiedź na to samo pytanie SO sugeruje rzutowanie typów każdego obiektu instancji w bazie kodu przy użyciu.becomes
- Jeszcze inny w StackOverflow , najlepsza odpowiedź to sposób w obozie Powtarzaj się i sugeruje utworzenie zduplikowanego rusztowania dla każdej podklasy.
- Oto znowu to samo pytanie w SO, gdzie górna odpowiedź wydaje się po prostu błędna (magia Railsów po prostu działa!)
- W innym miejscu w sieci znalazłem ten wpis na blogu, w którym F2Andy zaleca edycję ścieżki w każdym miejscu kodu.
- W poście na blogu Dziedziczenie pojedynczej tabeli i RESTful Routes at Logical Reality Design zaleca się zmapowanie zasobów podklasy do kontrolera nadklasy, jak w odpowiedzi SO nr 2 powyżej.
- Alex Reisner ma posta Single Table Inheritance w Rails , w którym opowiada się przeciwko mapowanie zasobów zajęć dzieci do klasy dominującej
routes.rb
, ponieważ tylko od połowy trasy pęknięcialink_to
iredirect_to
, ale nie zform_for
. Dlatego zaleca zamiast tego dodanie metody do klasy nadrzędnej, aby podklasy kłamały na temat swojej klasy. Brzmi dobrze, ale jego metoda dała mi błądundefined local variable or method `child' for #
.
Tak więc odpowiedzią, która wydaje się najbardziej elegancka i ma największy konsensus (ale nie jest to aż tak eleganckie ani aż tak dużo konsensusu), jest dodanie zasobów do swoich routes.rb
. Tyle że to nie działa form_for
. Potrzebuję jasności! Aby wydestylować powyższe opcje, moje opcje są
- zamapuj zasoby podklasy na kontroler nadklasy w
routes.rb
(i mam nadzieję, że nie będę musiał wywoływać form_for na żadnej podklasie) - Zastąp wewnętrzne metody railsów, aby klasy okłamały się wzajemnie
- Edytuj każde wystąpienie w kodzie, w którym ścieżka do akcji obiektu jest wywoływana niejawnie lub jawnie, zmieniając ścieżkę lub rzutowanie typu obiektu.
Przy tych wszystkich sprzecznych odpowiedziach potrzebuję orzeczenia. Wydaje mi się, że nie ma dobrej odpowiedzi. Czy to błąd w projektowaniu szyn? Jeśli tak, czy jest to błąd, który można naprawić? A jeśli nie, to mam nadzieję, że ktoś może mi na to pozwolić, przeprowadzić mnie przez wady i zalety każdej opcji (lub wyjaśnić, dlaczego nie ma takiej opcji) i która z nich jest właściwą odpowiedzią i dlaczego. A może istnieje prawidłowa odpowiedź, której nie znajduję w sieci?