2012-01-20 17 views
10

Tengo un modelo llamado ImplicitTest. Se llama así porque tener un objeto Ruby llamado Test simplemente rompe muchas cosas en Rails.Cómo escribir el enrutamiento cuando el nombre del modelo de recurso no coincide con la ruta o el controlador

Sin embargo, todavía quiero exponerlo como un recurso RESTful como test (por ejemplo, , /test/1/edit y así sucesivamente). Además, sería genial mantener el controlador como TestsController, aunque eso es menos importante.

que estaba haciendo esto a través de la línea de simples resources :tests en mi archivo routes.rb, pero esto no funciona para las formas REST (por ejemplo <%= form_for @test ... > - esto recoge que el objeto es de tipo @test ImplciitTest, y trata de las operaciones de búsqueda, que implicit_test_path no existe.

he intentado añadir form_for opciones, pero llegué a la conclusión de que para tener el trabajo forma para ambos new y edit acciones, no había una manera única, unificada de pedir form_for() para utilizar un prefijo diferente para la búsqueda del nombre de ruta.

Así que he estado tratando de abordar el problema desde el enrutamiento lado. ¿Hay una línea que puedo añadir en el fichero de rutas que me va a permitir:

  1. Tener un modelo llamado ImplicitTest
  2. tiene la ruta como/prueba
  3. Uso del <% = form_for @test .. .%> etiqueta todavía
  4. Mantenga el controlador como TestsController (opcional)

sé que estoy de salir de la trayectoria de oro para hacer esto, pero los carriles no me deja usar la prueba como un nombre de modelo, pero esto es el nombre que los usuarios esperarán ver en la URL de este recurso, así que espero que haya opciones simples de enrutamiento que lo habiliten.

Respuesta

8

Todo lo que necesita hacer es configurar la opción :path en su ruta:

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

Se podría seguir utilizando el estándar implicit_tests_path ayudante de esta manera, también, así que su código no tiene que divergen para alterar el Esquema de URL.

+2

Eso no parece ajustar el nombre del controlador, pero ajustándolo a 'resources: implicit_tests,: controller =>" tests ",: path =>" tests "' parecía agregar eso en. – Phantomwhale

1

mientras busca en la respuesta de coreyward, me encontré con un método más corto, pero menos intuitivo de conseguir lo que necesito:

resources :tests, :as => "implicit_tests"

Son estas haciendo esencialmente lo mismo (dado el extra :controller interruptor añadí en los comentarios)? ¿O se prefiere uno?

+0

Puedes hacerlo esto también, pero las referencias mixtas a su controlador de Pruebas implícitas y el modelo con nombres que realmente no se ajustan a "Rails Way" comienzan a ser confusos. – coreyward

+1

Ah ok, pensé mucho. Feliz de intentar y estar lo más cerca posible de los rieles, así que iré con tu respuesta. También podría volver a tener un ImplicitTestController, para mantener baja la cantidad de opciones de enrutamiento y para mantener el nombre del controlador más cerca del nombre del modelo, lo cual es probablemente mejor que mantenerlo más cerca del nombre de ruta; esencialmente lo que sugieres arriba. – Phantomwhale

Cuestiones relacionadas