Представления и контроллеры 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 ищет маршрут, определяемый именем класса объекта, который является сотрудником. Эти маршруты сотрудников не определены, и нет контроллера сотрудника, поэтому действия также не определены.
Этот вопрос задан раньше:
- В qaru.site/info/39531/... ответ должен отредактировать каждый экземпляр link_to и т.д. во всей вашей кодовой базе и указать путь явно
- В qaru.site/info/39531/... два человека предлагают использовать
routes.rb
для сопоставления ресурсов подкласса родительскому классу (map.resources :employees, :controller => 'people'
). Верхний ответ в том же самом вопросе SO предполагает, что тип экземпляра каждого экземпляра в базе кода использует тип.becomes
- Еще один из qaru.site/info/39531/..., лучший ответ - в лагере Do Repeat Yourself и предлагает создать дублирующие леса для каждого подкласса.
- Вот и тот же вопрос снова в SO, где верхний ответ кажется просто неправильным (Rails magic Just Works!)
- В другом месте в Интернете я нашел это сообщение в блоге, где F2Andy рекомендует редактировать в пути всюду в коде.
- В сообщении в блоге Одиночные таблицы и RESTful Routes в Logical Reality Design рекомендуется сопоставить ресурсы для подкласса с суперклассом контроллер, как и в ответе "Ответ №2" выше.
- У Alex Reisner есть сообщение Одиночное наследование таблиц в Rails, в котором он выступает против сопоставления ресурсов дочерних классов родительскому классу в
routes.rb
, так как это только ловит разрывы маршрутизации отlink_to
иredirect_to
, но не отform_for
. Поэтому он рекомендует вместо этого добавить метод к родительскому классу, чтобы заставить подклассы лгать об их классе. Звучит неплохо, но его метод дал мне ошибкуundefined local variable or method `child' for #
.
Таким образом, ответ, который кажется самым изящным и имеет наибольший консенсус (но это не все, что изящно и не так консенсус), добавляет ресурсы к вашему routes.rb
. Кроме того, это не работает для form_for
. Мне нужна ясность! Чтобы отменить выбор выше, мои параметры
- сопоставить ресурсы подкласса с контроллером суперкласса в
routes.rb
(и, надеюсь, мне не нужно вызывать form_for для любых подклассов) - Переопределить внутренние методы рельсов, чтобы классы лежали друг с другом.
- Редактировать каждый экземпляр кода, в котором путь к действию объекта вызывается неявно или явно, либо изменяя путь, либо тип-литье объекта.
Со всеми этими противоречивыми ответами мне нужно решение. Мне кажется, что нет хорошего ответа. Это неудача в дизайне рельсов? Если да, это ошибка, которая может быть исправлена? Или, если нет, то я надеюсь, что кто-то может направить меня прямо на это, проведет меня через плюсы и минусы каждого варианта (или объясните, почему это не вариант), и какой из них правильный ответ и почему. Или есть правильный ответ, который я не нахожу в Интернете?