2016-07-03 4 views
0

Что я хочу сделать, это сохранить атрибуты моей песни в той же форме, что и я, для загрузки моих mp3-файлов. В настоящее время я использую жемчужину AWS-SDK.Загрузка атрибутов модели с файлом с использованием AWS SDK Rails 4

На данный момент я могу успешно загрузить mp3-файлы в AWS. Однако, когда я пытаюсь сохранить атрибуты «song_title» и «album_id», данные не сохраняются, но файл загружается.

Song атрибуты:

"Идентификатор", "URL", "имя", "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 

песни/_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 %> 

Я попытался изменить метод создания в songs_controller т o следующее. (Я добавил "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 

и песни загрузить форму на следующее:

<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 %> 

Однако, я получаю следующее сообщение об ошибке:

param is missing or the value is empty: song 

Я подозреваю, что проблема имеет какое-то отношение к форме «form_tag» и «form_for» в формах.

Осмотревшись, я обнаружил, что form_tag создает базовую форму, а form_for создает форму для объекта модели.

Так, при изменении формы загрузки на рисунке ниже:

<%= 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 %> 

я получаю следующее сообщение об ошибке:

undefined method `original_filename' for nil:NilClass 

И ошибка ссылается на следующие строки в методе «создать» моего songs_controller:

obj = S3_BUCKET.objects[params[:file].original_filename] 

Я просмотрел документацию AWS-SDK, но я нахожу это информация на удивление трудно найти.

Может кто-нибудь упустит какой-то свет на то, как я собираюсь сохранить свои атрибуты песни, а также загрузить свой mp3-файл песни?

+0

Нулевой класс - это просто класс ноль. Это означает, что объекта нет, поэтому 'original_filename' не существует. – Michael

+0

Да, эта ошибка возникает, когда я использую форму form_for. Однако, с формой form_tag, файл песни загружается правильно без ошибки. – user3700231

ответ

0

Вы создали метод song_params, но я не вижу, чтобы вы его использовали. Вы должны явно указать свой объект с параметрами, возвращаемыми song_params, чтобы сохранить атрибуты по song.save.

@song = Song.new(song_params) 
+0

В рамках метода «create» у меня есть @song = Song.new (song_params, url: obj.public_url, имя: obj.key ) Однако это не работает. Любой способ добавить «song_params» в существующую переменную экземпляра песни? – user3700231

+0

Почему вы передаете 'id' в разрешенных параметрах? – Michael

+0

Я предполагал, что это было необходимо. Однако, даже если я удалю его, проблема остается. – user3700231