Мої Рейки думку і контролери завалені redirect_to
, link_to
і form_for
викликами методів. Іноді link_to
і redirect_to
явні в шляхах, які вони пов'язують (наприклад link_to 'New Person', new_person_path
), але багато разів шляхи є неявними (наприклад link_to 'Show', person
).
Я додаю деяку спадщину однієї таблиці (STI) до моєї моделі (скажімо Employee < Person
), і всі ці методи розбиваються на екземпляр підкласу (скажімо Employee
); коли рейки виконуються link_to @person
, він помилки з undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
. Rails шукає маршрут, визначений назвою класу об'єкта, який є службовцем. Ці маршрути співробітників не визначені, і немає контролера працівника, тому дії також не визначені.
Це питання було задано раніше:
- У StackOverflow відповідь полягає в редагуванні кожного екземпляра link_to тощо у всій вашій кодовій базі та констатуйте шлях прямо
- На StackOverflow знову, двоє людей пропонують використовувати
routes.rb
для зіставлення підкласу ресурсів на батьківський клас (map.resources :employees, :controller => 'people'
). Найвища відповідь у тому самому запитанні SO пропонує запропонувати тип-кастинг кожного об'єкта екземпляра в кодовій базі.becomes
- Ще одна у StackOverflow , головна відповідь - це спосіб у таборі Do Repeat Yourself, і пропонує створити дублікати лісів для кожного підкласу.
- Ось те саме запитання в SO, де головна відповідь здається просто неправильною (Rails magic Just Works!)
- Ще в Інтернеті я знайшов цю публікацію в блозі, де F2Andy рекомендує редагувати в коді всюди в коді.
- У публікації щоденника блогу Наспадкування єдиної таблиці та маршрути RESTful у дизайні логічної реальності рекомендується зіставити ресурси для підкласу до контролера надкласового класу, як у відповіді № 2 вище.
- Alex Рейснер має запис однієї таблиці Спадкування в Rails , в якому він виступає за проти картування ресурсів дочірніх класів батьківського класу
routes.rb
, так що тільки улови маршрутизації обриви відlink_to
іredirect_to
, але не зform_for
. Тому він рекомендує замість цього додати метод до батьківського класу, щоб отримати підкласи брехні про їх клас. Звучить добре, але його метод дав мені помилкуundefined local variable or method `child' for #
.
Таким чином, відповідь , який здається найбільш елегантно і має найбільший консенсус (але це ще не все , що елегантним, ні що багато консенсусу), є додавання ресурсів до вашого routes.rb
. За винятком цього не працює form_for
. Мені потрібна ясність! Щоб переганяти варіанти вище, мої варіанти є
- зіставити ресурси підкласу до контролера надкласу в
routes.rb
(і сподіваюся, мені не потрібно викликати form_for для будь-яких підкласів) - Переосмислить рейкові внутрішні методи, щоб змусити класи брехати один одному
- Відредагуйте кожен екземпляр у коді, де шлях до дії об’єкта викликається неявно або явно, або змінюючи шлях, або об'єкт-кастинг.
З усіма цими суперечливими відповідями мені потрібна ухвала. Мені здається, що немає хорошої відповіді. Це невдача в дизайні рейок? Якщо так, чи може виправити помилку? А якщо ні, то я сподіваюсь, що хтось зможе мене зрозуміти, переглядати плюси і мінуси кожного з варіантів (або пояснити, чому це не варіант), і який з них є правильною відповіддю і чому. Або є правильна відповідь, яку я не знаходжу в Інтернеті?