2017-03-22 3 views
0

Ich erstelle eine Funktion, bei der mehrere Modelle (3+) Bilder oder Dokumente enthalten. Um doppelten Code zu reduzieren, habe ich ein einzelnes Modell MediaUploads erstellt, das belongs_to :user ergibt einen Benutzer has_many :media_uploads.Verschachtelte Attribute für ein Modell, das nicht direkt zugeordnet ist

Die MediaUploads Tabelle speichert die Benutzer-ID neben Dateiinformationen, nichts spezifisch für ein anderes Modell. Wobei jedes Modell, das ein Bild benötigt, die Assoziation has_one :media_upload und eine Referenzspalte in seiner DB-Tabelle t.integer "media_uploads_id aufweist. Ich denke, dies ist ein geeigneter Weg, um dies zu erreichen, aber ich stoße auf ein paar Probleme.

Das obige Setup funktioniert gut, wenn ein Benutzer ihre Medien verwaltet, aber ich habe Mühe, dies mit verschachtelten Formularen zu arbeiten. Ein Beispiel, Post die ein MediaUpload erfordern können wie folgt aussehen:

accepts_nested_attributes_for :media_upload jetzt, wenn ich byebug verwenden und erhält die params ich die Dateidetails wurden ActionController::Parameters {"media_uploads"=>{"filename"=>#<... enthalten sehen kann, aber post_params verwenden, kann ich sehen, dass es nicht erlaubt war. Ich habe dies zu den starken params wie folgt hinzugefügt: ...post attributes..., media_upload_attributes: [ :filename ] - Ich habe auch nur media_upload und media_uploads versucht.

Mein googeln hält mich zurück zum Ändern der new Methode, um etwas zu bringen wie:

@post = Post.new @post.build_media_upload

, die mir den Fehler gibt unknown attribute 'post_id' for MediaUpload. - vermutlich weil die build Bedürfnisse der Benutzer passieren, wenn man die user_id ist referenziert von MediaUpload

Könnte mir jemand ein paar Hinweise geben?

UPDATE

Dies ist, was zur Zeit ich habe, dass nicht funktioniert:

In meinem Post.rb ich habe folgende

has_one :media_upload 
accepts_nested_attributes_for :media_upload 

In meinem _form.html .erb Ich habe

<%= f.fields_for :media_uploads do |h| %> 
    <%= h.file_field :filename, class:"btn-file" %> 
<% end %> 

In meinem -Controller I

..post params..., media_uploads_attributes: [ :filename ]) 

habe ich die Daten sehen kann, wenn das Terminalkommando params jedoch post_params besagt Folgendes mit: Unpermitted parameter: media_uploads

Antwort

1

Es sollte in starkem params, weil Rails Plural sein betrachtet die Datenbanktabelle, nicht Ihre Modell- und Datenbanktabellen werden im Plural benannt.

So führen sollte:

...post attributes..., media_uploads_attributes: [ :filename ]

+0

Dank J. D aber es nicht mein Problem lösen.Ich habe meine Frage mit meinem genauen Setup aktualisiert, das Probleme verursacht (einschließlich Ihrer Änderungen) – Torrm

+0

Ich habe nicht viel früher mit 'file_field' gearbeitet, aber ich denke, dass Sie' f.fields_for' Block nicht brauchen. Ihr Fehler besagt, dass dies genau das ist, was nicht erlaubt ist. Versuchen Sie einfach 'f. file_field: filename, class: "btn-file" ' –

+0

oder wenn Sie den Datensatz eines neuen: media_uploads-Objekts in diesem Formular erstellen, sollten Sie es erstellen. Wenn direkt in Form, so etwas wie '<% = f.fields_for: media_uploads, post.media_uploads.build do | h | %> ' –

Verwandte Themen