Это то, что происходит из-за дизайна Rails.
Ниже приведено то, что в документации Rails API говорится о url_for
:
Опираясь на именованные маршруты
Передача записи (например, активной записи или активного ресурса) вместо
Хэш в качестве параметра параметров будет запускать именованный маршрут для этого
запись. Поиск произойдет по названию класса. Так прохождение
Объект Workshop попытается использовать маршрут workshop_path. если ты
иметь вложенный маршрут, такой как admin_workshop_path, который вам нужно будет вызвать
это явно (для url_for невозможно угадать этот маршрут).
Но точное указание на помощника требуется, когда у вас есть «вложенный маршрут», в точности. Если вложение происходит под ресурсом (без определенных видов маршрутизации, подробнее об этом позже), Rails сможет сгенерировать путь без проблем.
form_for
появляется в какой-то момент, например url_for
, для вызова polymorphic_url
, чтобы сгенерировать URL-адрес для цели, который, в свою очередь, вызывает build_named_route_call
.
Вы можете видеть, что build_named_route_call
просто генерирует underscored_versions переданных ModelNames и объединяет их вместе с подчеркиванием.
Возвращаю это к моему маршруту:
resources :subjects, path: 'library' do
resources :modules, controller: 'subject_modules'
end
Поскольку ресурс subject находится в каталоге / library /, установив :path
, его помощники остаются равными subjects_*
, и, следовательно, Rails без проблем генерирует URL для него при передаче Subject
. Ресурс subject_modules
(названный так, поскольку Rails резервирует имя модуля для моделей), однако, изменил свои именованные помощники с названия модели на значение :controller
.
Тайна раскрыта.