Rails неправильно генерирует маршрут для ресурса с: контроллером - PullRequest
1 голос
/ 04 января 2012

Итак, вот такие маршруты:

  resources :subjects, path: 'library' do
    resources :modules, controller: 'subject_modules'
  end

Когда я пишу form_for [@subject, @subject_module] (с этими двумя значениями, которые вы ожидаете), Rails пытается сгенерировать "subject_subject_module_path".

Когда я удаляю :path для ресурса субъектов, сгенерированный помощник остается таким же (как и ожидалось).

Что должно быть, это "subject_module_path"; Я подозреваю, что проблема в том, что Rails смотрит на контроллер для ресурсов модулей и использует его вместо его фактического пути, то есть он создает этот помощник:

subject_ + subject_module_ + path

Из того, что я до сих пор собирал, это указывает на возможность ошибки, но возможно ли, что это что-то на моей стороне или что-то задуманное дизайном?

Пока, я полагаю, это можно использовать как временное исправление:

form_for([@subject, @subject_module], url: subject_module_path(@subject, @subject_module))

Я использую Rails 3.1.3.

Ответы [ 2 ]

1 голос
/ 10 января 2012

Это то, что происходит из-за дизайна 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.

Тайна раскрыта.

1 голос
/ 04 января 2012

Если это форма (обновить или создать), тогда ваши маршруты должны указывать на

subjects_module_path

, который должен генерировать URL

/library/modules/

Вы пытались указать свою форму на

form_for [:subjects, @subject_module]

, который затем окажется на вашем контроллере subject_modules

Если честно, ваши названия очень запутанные и, вероятно, не помогают. В идеале subject_modules должно быть просто modules.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...