RoR TagLib-Ruby:如何在数据库中设置 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

我在这里做错了什么?更新: 定义set_id3_tags z = TagLib::MPEG::File.open(self.m_song.path) do |file| 标记 = file.id3v2_tag 标签.标题 结束 self.update_attribute!(:标题 => z) 结束

现在获取堆栈级别太深的错误。

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

接下来,以下行:

tag = file.id3v2_tag

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

tag = file.id3v2_tag(true)

好的,那么似乎您希望在设置标签数据后保存标签数据。为此,您必须显式调用 save,如下所示(请注意块的最后一行):

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

好的!所以我做了,在玩了又玩,玩了又玩。

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

结束

添加 if title.nil? 为我做了。回调很奇怪,但绝对有价值。希望这对其他人有所帮助。

相关内容

  • 没有找到相关文章

最新更新