RoR TagLib-Ruby:如何在DB中设置ID3标签

Jch*_*hes 0 id3 ruby-on-rails taglib-ruby

在此先感谢您的帮助.

我想在我的数据库中设置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**
Run Code Online (Sandbox Code Playgroud)

在我的模型中,我使用回调来保存对象(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
Run Code Online (Sandbox Code Playgroud)

我很确定我的语法是问题所在.该对象似乎遇到了错误

undefined method `title' for nil:NilClass with an infinite loop
Run Code Online (Sandbox Code Playgroud)

控制器创建动作是正常的:

 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
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?更新:def set_id3_tags z = TagLib :: MPEG :: File.open(self.m_song.path)do | file | tag = file.id3v2_tag tag.title end self.update_attribute!(:title => z)end

现在得到堆栈级别太深的错误.

rob*_*nst 5

首先,确保这self.m_song.path是正确的路径并且文件存在于那里.

接下来,以下行:

tag = file.id3v2_tag
Run Code Online (Sandbox Code Playgroud)

当文件还没有标记时不创建标记,因此可能返回nil.将可选参数"create"设置为true,以便自动创建标记:

tag = file.id3v2_tag(true)
Run Code Online (Sandbox Code Playgroud)

好的,那么您可能希望在设置标签数据后保存标签数据.为此你必须显式调用save,就像这样(注意块的最后一行):

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

有关详细信息,请参阅此处的文档:http://rubydoc.info/gems/taglib-ruby/frames