является защищенным атрибутом по умолчанию), если вы не установили атрибут type явно.
редставления 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
); когда рельсы выполняютсяlink_to @person
, это ошибки сundefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
, Rails ищет маршрут, определенный именем класса объекта-сотрудника. Эти маршруты сотрудников не определены, и нет контроллера сотрудников, поэтому действия также не определены.
Этот вопрос был задан ранее:
ВПереполнение стекаответ заключается в том, чтобы отредактировать каждый экземпляр link_to и т. д. во всей кодовой базе и явно указать путьНаПереполнение стека опять же, два человека предлагают использоватьroutes.rb
сопоставить ресурсы подкласса с родительским классом (map.resources :employees, :controller => 'people'
). Верхний ответ в этом же вопросе SO предлагает приведение типов каждого объекта экземпляра в кодовой базе с использованием.becomes
Еще один вПереполнение стекалучший ответ - в лагере «Повтори себя» и предлагает создать дублированные леса для каждого подкласса.Вот тот же вопрос снова в 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 для любых подклассов)Переопределить рельсы внутренними методами, чтобы классы лгали друг другуОтредактируйте каждый экземпляр в коде, где путь к действию объекта вызывается неявно или явно, либо изменяя путь, либо приводя тип к объекту.Со всеми этими противоречивыми ответами мне нужно решение. Мне кажется, что нет хорошего ответа. Это провал в дизайне рельсов? Если так, то это ошибка, которая может быть исправлена? Или, если нет, то я надеюсь, что кто-то может объяснить мне это, показать мне плюсы и минусы каждого варианта (или объяснить, почему это не вариант), какой из них правильный и почему. Или есть правильный ответ, который я не нахожу в Интернете?