2009-09-25 24 views
9

Siento la necesidad de pedir disculpas por hacer una pregunta tan simplista, pero cada vez me siento más frustrado con las Rails Guides. Estoy seguro de que responden a mi pregunta, pero no proporcionan el contexto suficiente para que realmente entienda cómo aplicar lo que me están dando. Google tampoco es de mucha ayuda, aunque es posible que esté buscando los términos/frases equivocados. Dado ese descargo de responsabilidad, voy a seguir adelante y preguntar:Completando una selección con datos de modelo en Rails

Tengo un Image que HABTM Album. Para apoyar eso, tengo una tabla albums_images con image_id y album_id campos (no otros). Por mi vida, no puedo encontrar la forma de rellenar mi formulario de imagen parcial para que el usuario pueda seleccionar los álbumes a los que debería pertenecer una imagen recién cargada.

Estoy aprendiendo Rails, así que realmente solo quiero los conceptos básicos. Estoy seguro de que hay complementos sofisticados para hacer esto de cientos de maneras, pero me gustaría aprender lo básico primero y construir a partir de ahí. Mi forma parcial es más o menos libros de texto:

<% form_for(@image, :html => { :multipart => true }) do |f| %> 
    # All the basics you'd expect to see. 
<% end %> 

mi último intento no funciona mejor que cualquier otra variación que he probado, pero parece que esto:

<p> 
    <%= f.label :album_id %> 
    <%= f.select(:album_id, current_user.albums, :id, :name) -%> 
</p> 

Una vez más, Reconozco la simplicidad de la pregunta que estoy haciendo y he leído lo que puedo encontrar, pero no he podido reunirlo en una solución completa. Parece que hay muchas maneras de hacerlo, pero no hay una discusión real de cada uno, sus pros/contras o cómo usarlos realmente en un contexto más amplio.

Gracias.

ACTUALIZACIÓN: Un par de claves para observar y una corrección de código. Primero, hay una relación HABTM entre imágenes y álbumes. Ninguna de las tablas modelo tiene un FK que hace referencia directamente al otro. En segundo lugar, se debe acceder a la colección del álbum como current_user.albums (corregido arriba). Un usuario has_many álbumes y un álbum belongs_to usuario.

ACTUALIZACIÓN: A petición de theIV a continuación, por el momento, con este código:

22: <p> 
23: <%= f.label :album_id %> 
24: <%= f.select(:album_id, current_user.albums.collect {|a| [a.name, a.id]}) -%> 
25: </p> 

me sale este error:

undefined method `album_id' for #<Image:0x1042ec110> 

consigo el error en la línea 24.

+0

¿Podría explicarnos qué tipo de error está recibiendo? O bien, publique algo de la salida de su registro de desarrollo? – theIV

+0

Esa es la cuestión, los errores han desaparecido según la variación que uso. A menudo, sin embargo, ha habido algún tipo de error de fusión o error de método faltante para "álbum_id". Por el momento, con este código: 22: \t

23: \t \t <% = f.label: album_id%> 24: \t \t <% = f.select (: album_id, current_user.albums.collect { | a | [a.name, a.id]}) -%> 25: \t

consigo este error: método no definido 'album_id' para # Espero que ayude. Esto es mucho más frustrante de lo que esperaba. –

+0

Lo siento, asumí que los comentarios permitirían bloques de código. Añadiré una actualización a la publicación original. –

Respuesta

6

Bueno, no estoy seguro de que es el mejor camino, el camino carriles o, francamente, incluso de una manera elegante, pero aquí está el código que he usado que parece estar trabajando hasta ahora.

<%= f.label 'Albums' -%> 
<%= collection_select(:image, :album_ids, current_user.albums, :id, :name, {}, { :multiple => true }) -%> 

En este punto, cuando digo "trabajar", todo lo que puedo dar fe es que la página se representa sin errores y el disco o discos apropiados se seleccionan cuando se edita una imagen. Todavía estoy sorprendido de lo difícil que fue armar una solución "completa" de una gran cantidad de fuentes dispares.

15

Creo que select elementos son uno de los aspectos más confusos de Rails, porque como dijiste, parece que hay varias formas de hacerlo.

Prueba esto:

<%= f.select(:album_id, @image.albums.all.collect {|a| [a.name, a.id]}) -%> 
+0

He corregido/enfatizado un par de puntos con respecto a mi estructura, pero esto no funcionó para mí. Podría ser debido a cambios que tuve que hacer b/c. Tenía algo de mala información arriba. Lo que ahora tengo es '<% = f.select (: album_id, current_user.albums.collect {| a | [a.name, a.id]}) -%>'. También probé con el '.all' named_scope. –

Cuestiones relacionadas