2010-07-27 21 views
10

I tienen dos clases:Rails 3 has_one enrutamiento

class User < ActiveRecord::Base 
    :has_one :foo 
end 

class Foo < ActiveRecord::Base 
    :belongs_to :user 
end 

El foo es opcional.

creé la siguiente ruta:

resources :users do 
    resources :foo 
end 

que se traduce en las siguientes rutas:

GET /users/:user_id/foo(.:format)    {:controller=>"foos", :action=>"index"} 
user_foos POST /users/:user_id/foo(.:format)    {:controller=>"foos", :action=>"create"} 
new_user_foo GET /users/:user_id/foo/new(.:format)   {:controller=>"foos", :action=>"new"} 
GET /users/:user_id/foo/:id(.:format)   {:controller=>"foos", :action=>"show"} 
PUT /users/:user_id/foo/:id(.:format)   {:controller=>"foos", :action=>"update"} 
user_foo DELETE /users/:user_id/foo/:id(.:format)   {:controller=>"foos", :action=>"destroy"} 
edit_user_foo GET /users/:user_id/foo/:id/edit(.:format)  {:controller=>"foos", :action=>"edit"} 

Preguntas:

  1. Parece que el indexar y mostrar acciones son redundantes. ¿Debería uno eliminarse? ¿Si es así, Cuál?
  2. El parámetro id en la acción Mostrar parece innecesario, ya que user_id es una clave externa en la tabla de foos y solo hay un foo por usuario. ¿Estoy equivocado?
  3. Me gustaría tener una manera elegante de encaminarme a la acción nueva si no hay un foo. Una opción sería probar @ user.foo.nil? en la acción Show o Index de FooController, luego redirija a la acción Nueva. ¿Hay una mejor manera?

Gracias por su tiempo.

Respuesta

25

Si su modelo tiene una asociación has_one, intente configurar la ruta utilizando resource :foo (tenga en cuenta el nombre del método singular "recurso", no "recursos"). Esto configurará una ruta de recurso singleton (que, por ejemplo, no tiene acción de índice y las acciones de los miembros no tienen un id param, ya que solo hay un miembro). Consulte también http://apidock.com/rails/ActionController/Resources/resource (documentación 2.3, pero se aplica a 3.0 también afaik).

+2

No puedo creer que me haya perdido eso. – craig

+1

Gracias por la información –

2

Entiendo por qué Craig se perdió eso en realidad. Es una diferencia tan sutil que ni siquiera se me pasó por la cabeza. Lo único que me avisó es que mis rutas nombradas para el recurso singleton tienen un nombre de índice extraño: user_foo_index en lugar de user_foos.

Es una deducción muy inteligente de la ausencia de plural por parte de Rails.

Advertencia: Los siguientes ejemplos utilizan anidación poco profunda por cualquiera hacer esto:

resources :cats, shallow: true do 
    resources :noms 
end 

O que:

resources :cats do 
    shallow do 
    resources :noms 
    end 
end 

De todos modos volver al negocio, si usted fija un recurso singular - address en contraposición a articles por ejemplo - y se ve algo como esto:

user_address_index GET | POST 
    new_user_address GET 
     edit_address GET 
      address GET | PUT | DELETE 

Entonces, como Andreas justamente señaló, es probable que incorrectamente declaró esto en sus rutas:

resources :users do 
    resources :address 
end 

Y si cambia eso para:

resources :users do 
    resource :address 
end 

Debe ser todo bien y feliz y vea algo así si pincha rake routes en su mensaje:

 user_address POST | GET | PUT | DELETE 
new_user_address GET 
edit_user_address GET 

Nota: Sé que la salida de las rutas de rastrillos no se ve exactamente como esta (es mucho más detallada), solo estoy simplificando por el bien del enfoque.

Espero que ayude.

Cuestiones relacionadas