Мои представления и контроллеры Rails завалены redirect_to
, link_to
, и form_for
вызовов методов. Иногда link_to
и redirect_to
явно указаны в путях, которые они связывают (например, link_to 'New Person', new_person_path
), но часто пути являются неявными (например, link_to 'Show', person
).
Я добавляю наследование одной таблицы (STI) в свою модель (скажем, Employee ), и все эти методы нарушают работу экземпляра подкласса (скажем,
Employee
); когда rails выполняет link_to @person
, возникает ошибка undefined method employee_path 'для # : 0x0000010226d038>
. Rails ищет маршрут, определяемый именем класса объекта, которым является сотрудник. Эти маршруты сотрудников не определены, и нет контроллера сотрудников, поэтому действия также не определены.
Этот вопрос задавался раньше:
. rb
для сопоставления ресурсов подкласса с родительским классом ( map.resources: employee,: controller => 'people'
). Главный ответ в том же вопросе SO предполагает приведение типов к каждому объекту экземпляра в базе кода с использованием .becomes
routes.rb
, так как он перехватывает сбои маршрутизации только из link_to
и redirect_to
, но не из form_for
. Поэтому он рекомендует вместо этого добавить метод к родительскому классу, чтобы подклассы лгали о своем классе. Звучит хорошо, но его метод дал мне ошибку undefined локальная переменная или метод `child 'для #
. Итак, ответ, который кажется наиболее элегантным и наиболее согласованным (но это еще не все этот элегантный, ни , большой консенсус), не добавление ресурсов в ваш routes.rb
. За исключением того, что это не работает для form_for
. Мне нужна ясность! Чтобы исключить вышеперечисленные варианты, я могу
routes.rb
(и надеюсь, мне не нужно вызывать form_for для каких-либо подклассов) Со всеми этими противоречивыми ответами мне нужно решение. Мне кажется, хорошего ответа нет. Это недостаток конструкции рельсов? Если да, то можно ли исправить эту ошибку? А если нет, то я Я надеюсь, что кто-то сможет меня прямо объяснить, расскажет о плюсах и минусах каждого варианта (или объяснит, почему это не вариант), и какой из них правильный и почему. Или есть правильный ответ, которого я не нахожу в Интернете?