2011-06-25 11 views
27

Estoy migrando una versión de Rails 2.3.8 a Rails 3.0 y he reescrito el archivo de mi ruta. Cuando enumero las rutas usando rake routes, veo que algunos nombres de ruta tienen _index adjunto a ellos. No puedo entender por qué es esto.Rails 3 ruta anexa _index al nombre de ruta

rutas pertinentes:

Rails 2.3.8:

map.namespace "tracker", :path_prefix => "" do |planner| 
    planner.resources :planner, :collection => {:step1 => :get, 
               :add => :get, 
               :unsubscribe => [:get, :post] } 
end 

Rails 3.0 ruta:

namespace "tracker", :path => "" do 
    resources :planner do 
    collection do 
     get :step1 
     get :add 
     get :unsubscribe 
     post :unsubscribe 
    end 
    end 
end 

salida de rake routes

Rails 2.3.8

step1_tracker_planner  GET /planner/step1(.:format) 
add_tracker_planner   GET /planner/add(.:format) 
unsubscribe_tracker_planner GET /planner/unsubscribe(.:format) 
          POST /planner/unsubscribe(.:format) 

Rails 3.0

step1_tracker_planner_index  GET /planner/step1(.:format) 
add_tracker_planner_index   GET /planner/add(.:format) 
unsubscribe_tracker_planner_index GET /planner/unsubscribe(.:format) 
            POST /planner/unsubscribe(.:format) 

¿Alguna idea de por qué se está añadiendo este _index sería muy apreciado.

Respuesta

41

Es porque su recurso se llama :planner en lugar de :planners que Rails decidió agregar el _index a cualquier colección anidada debajo. Creo que está ahí para facilitar la lectura.

La acción nombrada en la colección normalmente se traduce en un verbo, por lo que puedo ver por qué esto tiene sentido. Tomemos el ejemplo típico de fotos recurso dado en la documentación de enrutamiento:

resources :photos do 
    collection do 
    get 'search' 
    end 
end 

search_photos GET /photos/search(.:format) 

Pero si en vez llamamos a los recursos 'foto' ...

resources :photo do 
    collection do 
    get 'search' 
    end 
end 

search_photo_index GET /photo/search(.:format) 

En el primer caso, se busca las "fotos" , y en el segundo caso busca el "índice de fotos".

+2

¿Hay alguna manera de cambiar este comportamiento? – etc

+9

Puede usar la palabra "recurso" (singular) en lugar de "recursos" en su archivo de rutas. Esto generará rutas similares como una solicitud de "recursos", con la excepción de la ruta de índice. Como Rails asume que estás trabajando con un objeto singular, no está generando automáticamente un índice porque no tendrías una lista de elementos, solo tendrías uno. Lea más aquí: http://guides.rubyonrails.org/routing.html#singular-resources – Jocko

9

Debe usar resource :planner ya sea resources :planners dependiendo de lo que necesite. Para aprender sobre el recurso singular y sus diferencias visita Rails Guides.

+0

¡Un gran consejo, gracias! –

+0

¿Qué sucede si su modelo es el mismo en singular y plural (por ejemplo, serie)? Parece agregar _index allí aunque no se quiera. – MattMcKnight

0

A raíz de la respuesta de Semyon Perepelitsa, tenga en cuenta que resource :planner espera el nombre del controlador es PlannersController, mientras que resources :planners espera PlannerController.

Si no desea cambiar el nombre de su controlador al cambiar de recursos a recursos, puede anular el valor predeterminado especificando resource :planner, controller: :planner.

Cuestiones relacionadas