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

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

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

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

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

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

  1. Имейте модель под названием ImplicitTest
  2. Иметь путь как / test
  3. Используйте тег <% = form_for @test ...%> по-прежнему
  4. Сохранить контроллер как TestsController (необязательно)

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

Ответы [ 2 ]

8 голосов
/ 20 января 2012

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

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

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

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

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

resources :tests, :as => "implicit_tests"

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

...