2013-06-09 5 views
2

Я тщательно искал 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) часть для того, чтобы работать.

Спасибо за все ответы!

+0

Возможно, я ошибаюсь, но я считаю, что направление вашего гнездования неверно. 'Artist' может' accept_nested_attributes_for' 'Track', потому что' Track' 'принадлежит_to'' Artist'. В вашем примере вы пытаетесь связать «Track» с «Artist», который еще не существует. Я думаю, вам нужно построить отношения по-другому, чтобы работать с nested_attributes. – muttonlamb

+0

Этот хэш не является ожидаемым вложенным атрибутами. Как вы строите форму? –

+0

О, вы получаете его из тегов id3 - я бы вообще не использовал вложенные атрибуты - просто создайте объекты-художники напрямую –

ответ

0

Я думаю, ваша проблема опечатка:

artists_attrubutes 

Кроме того, в контроллере попытаться написать:

@track = Track.new params[:track] 
@track.save 

использовать это следует организовать параметры в вашем представлении.

+0

Опечатка была от меня, исправляя код, который я скопировал в столбец stackoverflow, его действительно правильно в модели. Я также попробовал то, что вы предложили, и это не сработало. Спасибо за предложение. – user2209090

+0

Не могли бы вы вставить свой код вида? пожалуйста – juanpastas

0

Я получил его на работу, вот что нужно.

@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) часть для того, чтобы работать.

Спасибо за все ответы!

Смежные вопросы