Что я хочу сделать, это сохранить атрибуты моей песни в той же форме, что и я, для загрузки моих 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-файл песни?
Нулевой класс - это просто класс ноль. Это означает, что объекта нет, поэтому 'original_filename' не существует. – Michael
Да, эта ошибка возникает, когда я использую форму form_for. Однако, с формой form_tag, файл песни загружается правильно без ошибки. – user3700231