Представления и контроллеры My Rails заполнены вызовами методов 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
); когда rails выполняет 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 в Logical Reality Design рекомендуется сопоставлять ресурсы для подкласса с контроллером суперкласса, как в ответе 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 для каких-либо подклассов)
- Переопределить внутренние методы rails, чтобы классы лгали друг другу
- Редактировать каждый экземпляр в коде, где путь к действию объекта вызывается неявно или явно, либо изменяя путь, либо приводя тип к объекту.
Со всеми этими противоречивыми ответами мне нужно решение. Мне кажется, что нет хорошего ответа. Это провал в дизайне рельсов? Если это так, это ошибка, которая может быть исправлена? Или, если нет, то я надеюсь, что кто-то может объяснить мне это, показать мне плюсы и минусы каждого варианта (или объяснить, почему это не вариант), какой из них правильный и почему. Или есть правильный ответ, которого я не нахожу в Интернете?