Мои Рельсы мнение и контроллеры завалены 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-маршруты» в проекте « Логическая реальность» рекомендуется сопоставить ресурсы для подкласса с контроллером суперкласса, как в ответе SO 2 выше.
- У Алекса Рейснера есть пост- наследование таблиц в Rails , в котором он выступает против сопоставления ресурсов дочерних классов с родительским классом в
routes.rb
, поскольку он только отлавливает разрывы маршрутизации отlink_to
иredirect_to
, но не отform_for
. Поэтому он рекомендует вместо этого добавить метод в родительский класс, чтобы подклассы лгали об их классе. Звучит хорошо, но его метод дал мне ошибкуundefined local variable or method `child' for #
.
Таким образом, ответ , который кажется наиболее элегантно и имеет наибольший консенсус (но это еще не все , что элегантным, ни что много консенсуса), является добавление ресурсов к вашему routes.rb
. За исключением того, что это не работает для form_for
. Мне нужна ясность! Чтобы выбрать варианты выше, мои варианты
- сопоставить ресурсы подкласса с контроллером суперкласса в
routes.rb
(и надеюсь, мне не нужно вызывать form_for для любых подклассов) - Переопределить рельсы внутренними методами, чтобы классы лгали друг другу
- Отредактируйте каждый экземпляр в коде, где путь к действию объекта вызывается неявно или явно, либо изменяя путь, либо приводя тип к объекту.
Со всеми этими противоречивыми ответами мне нужно решение. Мне кажется, что нет хорошего ответа. Это неудачный дизайн рельсов? Если так, то это ошибка, которая может быть исправлена? Или, если нет, то я надеюсь, что кто-то может объяснить мне это, показать мне плюсы и минусы каждого варианта (или объяснить, почему это не вариант), какой из них правильный и почему. Или есть правильный ответ, который я не нахожу в Интернете?