Ich möchte die Attribute meines Song-Modells in derselben Form speichern, in der ich meine MP3-Dateien hochlade. Ich verwende derzeit das AWS-SDK-Juwel.Hochladen von Modellattributen mit Datei mit AWS SDK Rails 4
Ab sofort kann ich erfolgreich mp3-Dateien nach AWS hochladen. Wenn ich jedoch versuche, die Attribute "song_title" und "album_id" zu speichern, werden die Daten nicht gespeichert, aber die Datei wird hochgeladen.
Song-Attribute:
"id", "url", "name", "created_at", "updated_at", "album_id", "SONG_TITLE"
songs_controller:
class Albums::SongsController < ApplicationController
before_filter :set_user_friendships
def new
@song = Song.new
end
def create
# Make an object in your bucket for your song
obj = S3_BUCKET.objects[params[:file].original_filename]
# Upload the file
obj.write(
file: params[:file],
acl: :public_read
)
# Create an object for the song
@song = Song.new(
url: obj.public_url,
name: obj.key
)
# Save the upload
if @song.save
redirect_to songs_path, success: 'File successfully uploaded'
else
flash.now[:notice] = 'There was an error'
render :new
end
end
def index
@user_friendships = current_user.user_friendships.all
@songs = Song.all
end
def song_params
params.require(:song).permit(:id, :url, :name, :song_title, :album_id)
end
def set_user_friendships
@user_friendships = current_user.user_friendships.all #this is here because of partial UGHHH
end
end
Lieder/_upload_song.html.erb:
<p>Upload a song</p>
<%= form_tag songs_path, enctype: 'multipart/form-data' do %>
<%= file_field_tag :file %>
<%= submit_tag 'Upload song' %>
<% end %>
ich versuchte, die create-Methode innerhalb des songs_controller t Ändern o das Folgende. (I added "song_params"):
def create
# Make an object in your bucket for your song
obj = S3_BUCKET.objects[params[:file].original_filename]
# Upload the file
obj.write(
file: params[:file],
acl: :public_read
)
# Create an object for the song
@song = Song.new(song_params,
url: obj.public_url,
name: obj.key
)
# Save the upload
if @song.save
redirect_to songs_path, success: 'File successfully uploaded'
else
flash.now[:notice] = 'There was an error'
render :new
end
end
und die Songs laden an folgende:
<p>Upload a song</p>
<%= form_tag songs_path, enctype: 'multipart/form-data' do %>
<%= file_field_tag :file %>
<%= text_field_tag :song_title %>
<%= submit_tag 'Upload song' %>
<% end %>
Allerdings bekomme ich folgende Fehlermeldung:
param is missing or the value is empty: song
Ich vermute, dass die Das Problem hat etwas mit dem Unterschied zwischen form_tag und form_for in Formularen zu tun.
Nachdem ich mich umgesehen habe, habe ich festgestellt, dass form_tag ein Basisformular erstellt und form_for ein Formular für ein Modellobjekt erstellt.
also beim Wechsel der Upload-Formular unten auf der einen:
<%= form_for Song.new, enctype: 'multipart/form-data' do |f| %>
<%= f.label :file %>
<%= f.file_field :file %>
<%= f.label :song_title %>
<%= f.text_field :song_title %>
<%= f.label :album_id %>
<%= f.number_field :album_id %>
<%= f.submit "Save", class: "btn btn-primary" %>
<% end %>
bekomme ich folgende Fehlermeldung:
undefined method `original_filename' for nil:NilClass
Und der Fehler bezieht sich auf die folgenden Zeilen in der „create“ Methode meiner songs_controller:
obj = S3_BUCKET.objects[params[:file].original_filename]
Ich schaute durch die AWS-SDK-Dokumentation, aber ich finde dies Informationen überraschend schwer zu finden.
Würde jemand etwas Licht darauf werfen, wie ich meine Song-Attribute speichern und meine Song-MP3-Datei hochladen würde?
Eine Nullklasse ist nur das, eine Nullklasse. Es bedeutet, dass es kein Objekt gibt, daher existiert 'original_filename' nicht. – Michael
Ja, dieser Fehler tritt auf, wenn ich das form_for-Formular verwende. Mit dem form_tag-Formular wird die Song-Datei jedoch ohne den Fehler korrekt hochgeladen. – user3700231