2016-07-03 7 views
0

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?

+0

Eine Nullklasse ist nur das, eine Nullklasse. Es bedeutet, dass es kein Objekt gibt, daher existiert 'original_filename' nicht. – Michael

+0

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

Antwort

0

Sie haben die Methode song_params erstellt, aber ich sehe nicht, dass Sie sie verwenden. Sie müssen Ihr Objekt explizit mit den von song_params zurückgegebenen Parametern festlegen, um die Attribute unter song.save zu speichern.

@song = Song.new(song_params) 
+0

Innerhalb der "create" -Methode habe ich @song = Song.new (song_params, url: obj.public_url, name: obj.key ) Das funktioniert jedoch nicht. Gibt es eine Möglichkeit, "song_params" zur vorhandenen Song-Instanz-Variable hinzuzufügen? – user3700231

+0

Warum geben Sie 'id' in den erlaubten Parametern ein? – Michael

+0

Ich nahm an, dass es erforderlich war. Aber selbst wenn ich es entferne, bleibt das Problem bestehen. – user3700231

Verwandte Themen