2009-09-25 9 views
9

Ich habe das Bedürfnis, mich zu entschuldigen, wenn ich so eine simple Frage gestellt habe, aber ich bin immer frustrierter mit den Rails Guides. Ich bin sicher, dass sie meine Frage beantworten, aber sie bieten nicht genügend Kontext für mich, um wirklich zu verstehen, wie man anwenden kann was sie mir geben. Google ist auch keine große Hilfe, obwohl ich vielleicht nur nach den falschen Begriffen suche. Mit diesem Disclaimer gehe ich einfach weiter und frage:Eine Auswahl mit Modelldaten in Rails füllen

Ich habe eine Image, die HABTM Album. Um das zu unterstützen, habe ich eine albums_images Tabelle mit image_id und album_id Felder (keine anderen). Für das Leben von mir kann ich nicht herausfinden, wie ich meine Bildform teilweise ausfüllen soll, damit der Benutzer die Alben auswählen kann, zu denen ein neu hochgeladenes Bild gehören soll.

Ich lerne Schienen, also will ich wirklich nur die Grundlagen. Ich bin mir sicher, dass es phantastische Plugins gibt, die das auf hundert verschiedene Arten machen, aber ich würde gerne zuerst die Grundlagen lernen und von dort aus aufbauen. Meine Form ist teilweise ziemlich viel Lehrbuch:

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

Mein letzter Versuch funktioniert nicht besser als jede andere Änderung Ich habe versucht, aber es sieht wie folgt aus:

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

Noch einmal, ich erkenne die Einfachheit der Frage, die ich stelle, und ich habe gelesen, was ich finden kann, aber ich konnte es nicht zu einer vollständigen Lösung zusammenfügen. Es scheint viele Wege zu geben, dies zu tun, aber keine wirkliche Diskussion über jede einzelne, ihre Vor- und Nachteile oder wie man sie wirklich in einem größeren Kontext verwendet.

Danke.

UPDATE: Ein paar Tasten zu beachten und eine Code-Korrektur. Erstens gibt es eine HABTM-Beziehung zwischen Bildern und Alben. Keine der Modelltabellen hat einen FK, der direkt auf den anderen verweist. Zweitens sollte die Album-Sammlung als current_user.albums (korrigiert oben) zugegriffen werden. Ein Benutzer has_many Alben und ein Album belongs_to Benutzer.

UPDATE: Auf Antrag des theIV unten, zur Zeit, mit diesem Code:

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

ich diesen Fehler:

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

Ich erhalte den Fehler in Zeile 24.

+0

Können Sie erklären, welche Art von Fehler Sie bekommen? Oder veröffentlichen Sie etwas von der Ausgabe Ihres Entwicklungsprotokolls? – theIV

+0

Das ist die Sache, die Fehler sind alle abhängig davon, welche Variation ich verwende. Oftmals gab es jedoch eine Art Merge-Fehler oder einen fehlenden Methodenfehler für "album_id". Im Moment mit diesem Code: 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

ich diesen Fehler: nicht definierte Methode 'album_id‘ für # ich hoffe, das hilft. Das ist viel frustrierender, als ich es erwartet hätte. –

+0

Sorry, ich nahm an, Kommentare würden Code-Blöcke erlauben. Ich werde dem ursprünglichen Beitrag ein Update hinzufügen. –

Antwort

6

Nun, ich bin nicht sicher, es ist der beste Weg, der Rails Weg oder, offen gesagt, auch eine elegante Art und Weise, aber hier ist der Code, den ich verwendet habe, das zu sein scheint so weit zu arbeiten.

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

An diesem Punkt, wenn ich „arbeiten“ sagen, alles, was ich wirklich bezeugen kann, dass die Seite ohne Fehler und das entsprechende Album oder Alben ausgewählt wird, macht, wenn ich ein Bild bearbeiten. Ich bin immer noch schockiert darüber, wie schwierig es war, eine "vollständige" Lösung aus vielen verschiedenen Quellen zusammenzubringen.

15

Ich denke, dass select Elemente einer der verwirrenden Aspekte von Rails sind, denn wie Sie gesagt haben, scheint es eine Reihe von Möglichkeiten, es zu tun.

Versuchen Sie folgendes:

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

Ich habe ein paar Punkte in Bezug auf meine Struktur korrigiert/betont, aber das hat bei mir nicht funktioniert. Könnte aufgrund von Änderungen sein, die ich machen musste b/c Ich hatte oben einige schlechte Informationen. Was ich jetzt habe, ist '<% ​​= f.select (: album_id, current_user.albums.collect {| a | [a.name, a.id]}) -%>'. Ich habe es auch mit dem '.all' named_scope versucht. –

Verwandte Themen