Как написать маршрутизацию, когда имя модели ресурса не соответствует пути или контроллеру
У меня есть модель под названием 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
, который я добавил в комментариях)? Или один из них предпочтительнее?