2010-06-30 19 views
13

que tienen una asociación polimórfica que tiene este aspecto:utilizando rutas polimórficos con asociaciones anidados

class Line < ActiveRecord::Base 
    belongs_to :item, :polymorphic => true 
end 

class Education < ActiveRecord::base 
    has_many :lines, :as => :item 
end 

class Work < ActiveRecord::base 
    has_many :lines, :as => :item 
end 

me gustaría una forma sencilla de crear una nueva línea del artículo superior. Entonces, podría estar editando una vista para un objeto Work, y quiero tener un enlace que cree un nuevo objeto Line. Normalmente, haría esto:

<%= link_to "New Line", new_work_line_path(@work) %> 

Y el ayudante trabajaría la ruta para esto. Sin embargo, esto requiere que verifique a qué padre pertenece la línea en el controlador, derrotando el propósito del polimorfismo (podría haber usado dos referencias si ese fuera el caso). Entonces, mi pregunta es, ¿cómo hago para que el camino funcione polimórficamente como un asistente de ruta normal?

+1

"Lo que estoy buscando es una forma de estar en una vista para, por ejemplo, un objeto de trabajo, y crear una nueva línea para entrar". Esta frase me confunde mucho. Cuidado para reformular? –

+0

He editado la pregunta para que sea más clara. – Zoe

Respuesta

7

Una manera posible podría ser el uso de rutas de esta manera:

map.resources :works do |works| 
    works.resources :lines 
end 

map.resources :educations do |edu| 
    edu.resources :lines 
end 

Su LinesController sigue siendo el mismo, y obtendrá rutas como éstas:

work_lines GET /works/:work_id/lines 
.... 
education_lines GET /educations/:education_id/lines 
... 

La parte más molesta es Administre la primera identificación aprobada, porque tendrá una params[:id] referida a una Línea, pero también tendrá params[:work_id] o params[:education_id]. Aquí debe elegir entre verificar qué parámetro se pasa o, al menos, analizar la url solicitada para determinar en qué se encuentra (Works, Educations, etc.).

Espero que esto ayudó;)

EDIT:

De acuerdo con lo que surgió en los comentarios, puede utilizar polymorphic_url/polymorphic_path (http://api.rubyonrails.org/classes/ActionDispatch/Routing/PolymorphicRoutes.html):

Tiene sentido si se utilizan como de esta manera:

link_to "New Line", polymorphic_url(@line.item,@line) 
# => /<educations_or_works>/item_id/lines/line_id 

Al menos, usted incluso se puede utilizar para las colecciones:

link_to "New Line", polymorphic_url(@line.item,Line.new) 
# => /<educations_or_works>/item_id/lines/ 

Cheers,
a.

+1

Esta es una forma de hacer esto, pero no es polimórfico en absoluto. He encontrado muchas variaciones sobre esto, y parece que las asociaciones polimórficas se incluyeron en ActiveRecord, pero se olvidaron por completo en cualquier otro lugar. Esperaba que ese no fuera el caso, y simplemente miré en los lugares equivocados. Sin embargo, lo tendré en cuenta si no puedo encontrar nada más. – Zoe

+0

Te mostré las rutas que mantienen tus asociaciones de modelos polimórficos. –

+0

bien, pero las rutas no se comportan polimórficamente, que es lo que estoy buscando. La ruta es específica de si la Línea pertenece a una Obra o a una Educación, como es el resultado en el controlador (: word_id y: education_id). Como se supone que ambos se asocian con líneas como un objeto Item, tendría sentido si hubiera una manera de obtener un: item_id allí que podría representar Work o Education. – Zoe

Cuestiones relacionadas