2011-04-08 16 views
8

En rieles 2.x Usé rutas poco profundas, pero esto parece faltar en los rieles 3 (al menos en el API http://apidock.com/rails/ActionController/Resources/resources).Rieles 3, rutas poco profundas

Cuando paso esta opción en los rieles 3 no arroja ningún error, pero tampoco recibo todas las rutas que esperaba.

Rails 3 routes.rb

resources :users, :shallow=>true do 
    resources :recipe do 
     resources :categories do 
     resources :sections do 
      resources :details do 
      end 
     end 
     end 
    end 
    end 

Las rutas faltantes que se generaron con los rieles 2.x equivalente son (sólo una muestra para el recurso receta):

GET new_recipe (I Sólo tiene new_user_recipe), y

receta POST (para crear una nueva receta, sólo tengo user_recipe POST)

Tiene sentido que estas rutas no se generarán, pero mi código anterior funcionó al pasar el user_id en cada forma (menos elegante, acordado).

La pregunta es: ¿Hay documentación para las rutas "superficiales" en los rieles 3? ¿Hay alguna manera de generar las rutas que me faltan en los rieles 2.x?

Gracias, Mike

Respuesta

5

es necesario aplicar la opción: poco profunda a los recursos anidados. Esto debe darle lo que quiere:

resources :users do 
    resources :recipe, :shallow=>true do 
     resources :categories do 
     resources :sections do 
      resources :details do 
      end 
     end 
     end 
    end 
    end 
+1

Pero los documentos API (al menos para 2.x) dicen que: shallow es heredado? Lo intenté, pero no pareció ser el truco. – CambridgeMike

3

Si nos fijamos en los carriles de 3 docs, verá que shallow es un método de instancia en ActionDispatch::Routing::Mapper::Resources, al igual que resource, resources, match, etc Usted debe ser capaces de nido de rutas de poca profundidad con algo como esto:

shallow do 
    resources :users do 
    resources :recipe do 
     resources :categories do 
     resources :sections do 
      resources :details 
     end 
     end 
    end 
    end 
end 

pesar de que sólo parece expandirse a 2 niveles en lugar de la ruta completa anidada. Consulte rake routes para obtener más información.

0

Puede encontrar la documentación de Rails 3 relacionada con rutas anidadas o poco profundas en el sitio Rails Guides.

Al ofrecer consejos sobre cómo anidar rutas, dice específicamente que "los recursos nunca deben anidarse a más de 1 nivel de profundidad".

0

Es razonable que solo tenga new_user_recipe en lugar de new_recipe. ¿Por qué? Porque desde la perspectiva de la receta, cada receta pertenece mucho a un usuario.

Otro punto es que

resources :users, :shallow=>true do 
    resources :recipe do 
    resources :categories do 
     resources :sections do 
     resources :details do 
     end 
     end 
    end 
    end 
end 

es exactamente el mismo que

resources :users do 
    resources :recipe, :shallow=>true do 
    resources :categories do 
     resources :sections do 
     resources :details do 
     end 
     end 
    end 
    end 
end 

:shallow se hereda como otros usuarios señalaron. Piénselo, :shallow significa que puede omitir la parte izquierda del patrón de URL una vez que esté seguro de cuál es exactamente el recurso en el que está trabajando. Si pones :shallow en la capa exterior, la mayoría de su recurso, que debe tener el mismo efecto que lo pones en la segunda capa (receta en su ejemplo).Como no tiene nada que omitir cuando trabaja en el recurso externo (usuarios en su ejemplo), ya es la parte más a la izquierda del patrón URL y no se puede omitir.

Cuestiones relacionadas