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
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
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" ' –
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 | %> ' –