Я тщательно искал stackoverflow и пробовал каждый полученный результат, но я все еще застрял. Вот проблема.Вложенные атрибуты не сохраняются
У меня есть приложение, которое позволяет загружать музыкальные файлы. После загрузки файла я просматриваю данные ID3 и использую эти данные для заполнения всей информации для объекта в моей базе данных ... например, название, альбом, год, жанр и т. Д.
В области художников иногда бывает много художников, поэтому для этого поля я написал метод, который принимает всех художников и хеширует как таковой;
{:artist => [{:name=>"Artist 1"},{:name=>"Artist 2"}]}
Эти данные теперь включены в объект, который я хочу сохранить в моей базе данных, и выглядит следующим образом;
#<Track id: 76, name: nil, title: "song title", tpath: "file_name.mp3", created_at: "2013-06-08 23:31:24", updated_at: "2013-06-08 23:31:24", track_number: 6, artist: {:artist => [{:name=>"Artist 1"},{:name=>"Artist 2"}]}, album_artist: "Artist Name", year: 2012, genre: "nil", bpm: nil, length: 252, size: 79872, user_id: 2>
В моей tracks_controller (где все действия происходят) У меня есть это для моего создания действия;
def create
@track = Track.new(params[:track])
@track.libraries << @library
@track.parse_id3(@track)
@track.update_attributes(@track[:artist]) --># I also tried @track.artist
respond_to do |format|
if @track.save
format.html { redirect_to library_track_path(@library, @track), notice: 'Track was successfully created.' }
format.json { render json: @library_track, status: :created, location: @track }
else
format.html { render action: "new" }
format.json { render json: @track.errors, status: :unprocessable_entity }
end
end
конец
Проблема заключается в том, что активная записи не сохранение/обновлении своей Artists (в названии таблице) с данными я обеспечиваю, но трек успешно сохранен в мою базу данных без ошибок ,
У меня есть следующая настройка отношений между исполнителями и треками;
class Artist < ActiveRecord::Base
attr_accessible :age, :birthdate, :first_name, :last_name, :name
has_many :tracks, :through => :artist_tracks
has_many :artist_tracks
end
Таблица объединений выглядит так;
class ArtistTrack < ActiveRecord::Base
attr_accessible :album_artist, :artist_id, :track_id
belongs_to :artist
belongs_to :track
end
И дорожка выглядит;
class Track < ActiveRecord::Base
attr_accessible :name, :title, :tpath, :track_number, :artist, :album_artist,
:year, :genre, :bpm, :length, :size, :user_id, :artists_attrubutes
mount_uploader :tpath, TpathUploader
belongs_to :user
has_many :libraries, :through => :track_libraries
has_many :track_libraries
has_many :playlists, :through => :playlist_tracks
has_many :playlist_tracks
has_many :artists, :through => :artist_tracks
has_many :artist_tracks
accepts_nested_attributes_for :artists
end
Форма, состоящая из одного поля, запрашивает местоположение файла для загрузки.
Что мне здесь не хватает?
Спасибо.
Я получил его на работу, вот что было необходимо.
@track.update_attributes(:artists_attributes => @track.parse_id3(@track))
.parse_id3 является метод, который я написал, что сканирует весь художник в поле художника в формате MP3 и превращает их в;
:artists_attributes => [{:name=>"Artist 1"},{:name=>"Artist 2"}]}
Я пробовал;
@track.update_attributes(:artists_attributes)
Видимо мне нужно добавить @ track.parse_id3 (@track) часть для того, чтобы работать.
Спасибо за все ответы!
Возможно, я ошибаюсь, но я считаю, что направление вашего гнездования неверно. 'Artist' может' accept_nested_attributes_for' 'Track', потому что' Track' 'принадлежит_to'' Artist'. В вашем примере вы пытаетесь связать «Track» с «Artist», который еще не существует. Я думаю, вам нужно построить отношения по-другому, чтобы работать с nested_attributes. – muttonlamb
Этот хэш не является ожидаемым вложенным атрибутами. Как вы строите форму? –
О, вы получаете его из тегов id3 - я бы вообще не использовал вложенные атрибуты - просто создайте объекты-художники напрямую –