2012-06-03 27 views
0

感謝您提前提供任何幫助。RoR TagLib-Ruby:如何在DB中設置ID3標籤

我想在我的數據庫中設置id3標籤數據作爲我的模型MasterSong的屬性。具體來說,標題,藝術家和專輯。

create_table :master_songs do |t| 
    t.integer :user_id 
    t.has_attached_file :m_song 
**- t.string :title 
- t.string :artist 
- t.string :album** 

在我的模型我使用一個回調來設置對象(master_song)之前的數據將被保存。

before_save :set_id3_tags_in_database 

def set_id3_tags_in_database 
TagLib::MPEG::File.open(self.m_song.path) do |file| 
    tag = file.id3v2_tag 
    tag.title 
    tag.album 
    tag.artist 
end 
    self.update_attributes(:title => tag.title, 
    :artist => tag.artist, 
    :album => tag.album) 
end 

我敢肯定,我的語法有問題。對象似乎遇到錯誤

undefined method `title' for nil:NilClass with an infinite loop 

控制器創建操作是正常的:

def create 
    @master_song = current_user.master_songs.build(params[:master_song]) 

    respond_to do |format| 
    if @master_song.save 
    format.html { redirect_to @master_song, notice: 'Master song was successfullycreated.' } 
    end 

我在做什麼錯在這裏? 更新: def set_id3_tags z = TagLib :: MPEG :: File.open(self.m_song.path)do | file | 標籤= file.id3v2_tag tag.title 結束 self.update_attribute!(:標題=> Z) 結束

GET棧層次過深的錯誤了。

回答

0

OK!所以我在玩,玩和玩之後做到了。

def set_id3_tags 
z = TagLib::MPEG::File.open(self.m_song.path) do |file| 
unless tag.nil? 
    tag = file.id3v2_tag 
    self.title = tag.title 
    self.album = tag.album 
    self.artist = tag.artist 

    else 
end 

添加如果title.nil?爲我做了。回調是奇怪的,但絕對有價值。希望這可以幫助別人。

+0

您還應該檢查'tag'是否爲零。爲什麼不直接通過'self.title = tag.title'和'self來設置塊的屬性。album = tag.album'等。 – robinst

+0

OK。我改變了我的答案。你怎麼看? – Jches

5

首先,確保self.m_song.path是正確的路徑,並在那裏存在一個文件。

接下來,下面一行:

tag = file.id3v2_tag 

不創建一個標籤時,該文件還沒有標籤,因此可能會返回零。設置可選的參數「創造」爲真爲它自動創建一個標籤:

tag = file.id3v2_tag(true) 

好,隨後便出現,你想保存標籤數據已設置了上去。對於您必須顯式調用保存,像這樣(注意塊的最後一行):

TagLib::MPEG::File.open(self.m_song.path) do |file| 
    tag = file.id3v2_tag(true) 
    # set data 
    file.save 
end 

欲瞭解更多信息,請參閱以下文件:http://rubydoc.info/gems/taglib-ruby/frames

+0

我更加困惑於我如何設置數據,然後將其設置在數據庫中。 'self.title => tag.title'。我在調用file.save之前設置了它嗎?我的想法是去self.update_attributes(:標題=> tag.title)其中'#設置數據'應該是。 – Jches

+0

我不想設置新的id3標籤。我想從歌曲中提取id3標籤並將其作爲模型屬性放在數據庫中,因此我可以輕鬆地將它們稱爲「master_song.title」。對不起,如果它之前還不清楚。 – Jches

+0

我越來越接近 – Jches