Как написать маршрутизацию, когда имя модели ресурса не соответствует пути или контроллеру

У меня есть модель под названием ImplicitTest. Он назвал это тем, что объект Ruby под названием Test просто ломает много вещей в Rails.

Тем не менее, я все же хочу показать его как ресурс RESTful как Test (например, /tests, /test/1/edit и т.д.). Кроме того, было бы здорово сохранить контроллер как TestsController, хотя это менее важно.

Я делал это, имея простую строку resources :tests в файле routes.rb, но это не подходит для форм RESTful (например, <%= form_for @test ... >) - это означает, что объект @test имеет тип ImplciitTest и пытается lookup implicit_test_path, который не существует.

Я попробовал добавить параметры form_for, но пришел к выводу, что для работы формы для действий new и edit не было ни единого единого способа просить form_for() использовать другой префикс для поиск имени пути.

Итак, я пытался подойти к проблеме со стороны маршрутизации. Есть ли строка, которую я могу добавить в файл маршрутов, который позволит мне:

  • Имейте модель под названием ImplicitTest
  • Введите путь как /test
  • Использовать тег <% = form_for @test...% >
  • Храните контроллер как TestsController (необязательно)

Я знаю, что я ухожу из Golden Path, но Rails не позволяет мне использовать Test в качестве имени модели, но это имя, которое пользователи ожидают увидеть в URL-адресе для этого ресурса, поэтому я надеясь, что есть простые опции маршрутизации, которые позволяют это.

Ответ 1

Все, что вам нужно сделать, это установить опцию :path на вашем маршруте:

resources :implicit_tests, :path => '/test'

Вы все равно будете использовать стандартный implicit_tests_path помощник, поэтому ваш код не должен отклоняться, чтобы изменить схему URL.

Ответ 2

В то время как я смотрел на ключевой ответ, я наткнулся на более короткий, но менее интуитивный метод получения того, что мне нужно:

resources :tests, :as => "implicit_tests"

Являются ли они, по сути дела, тем же самым (учитывая дополнительный переключатель :controller, который я добавил в комментариях)? Или один из них предпочтительнее?