2011-02-10 12 views
28

Estoy usando Rails 3.0.3 con ruby ​​1.9.2p0.Rails 3 fields_for - el orden de clasificación se pierde

En mi profiles_controller (función de edición) Tengo esta llamada

@profile = Profile.find(params[:id]) 
@profile_items = @profile.profile_items.order("pos") 

para obtener los @profile_items en el orden correcto, ordenados en "POS". En el _form.html.erb I tienen las siguientes

<% @profile_items.each do |pi| %> 
    <%= pi.pos %> | 
<% end %> 
<%= f.fields_for :profile_items do |f2| %> 
    <%= render 'profile_item_fields', :f => f2 %> 
<% end %> 

las 3 primeras líneas son código de prueba para mostrar que los @profile_items están en el orden correcto. ¡Pero cuando se procesan, pierden el orden ordenado!

Ahora tengo que buscar mucho por una respuesta y creo que esto debe ser una "trampa" común para caer en.

agradecido por cualquier ayuda ...

Respuesta

42

De acuerdo con la documentación rieles para fields_for, también puede especificar el objeto de registro después de que el nombre del registro.

así que algo como esto debería funcionar ...

<%= f.fields_for :profile_items, @profile_items do |f2| %> 
    <%= render 'profile_item_fields', :f => f2 %> 
<% end %> 
+20

pequeña modificación. Si desea mantener los registros ordenados, no lo haga en la asociación. Traerá cosas de la base de datos y eliminará sus entradas temporales (como las que tienen errores que no se guardaron). Entonces, en lugar de '@ profile_items.order ('position')' haz algo como esto: '@ profile_items.sort_by (&: position)'. – Grocery

+1

Mucho, mucho, mucho, mucho, mucho mejor que usar un alcance predeterminado. –

+0

... estoy de acuerdo con Grocery en el problema, pero los campos-for están implícitos en base a "acepta atributos anidados para", por lo que no hay @profile_items (utilizando este ejemplo) alguna vez definidos. Entonces, ¿cómo ordenar la colección generada implícitamente? Encontré esa respuesta aquí: https://stackoverflow.com/questions/10505853/how-to-maintain-the-ordering-for-nested-attributes-when-using-accepts-nested-att – JosephK

17

Esto se puede lograr con un default_scope en el modelo anidado:

class YourModel < ActiveRecord::Base 
    belongs_to :other_model 
    default_scope { order(:name) } 
end 
+0

Gracias por esto. Estaba perdiendo la voluntad de continuar –

+0

Esta es la mejor respuesta a cualquier cosa que haya visto. –

+0

Esta es una buena solución si _siempre_ desea ordenar esta clase de la misma manera. Si en última instancia desea pedirlo de otras maneras, esto puede complicar las cosas (tiene que rechazar el alcance predeterminado cada vez) y es mejor usar una orden manual o múltiples ámbitos nombrados. –

Cuestiones relacionadas