【问题标题】:RoR TagLib-Ruby: How to set ID3 tags in DBRoR TagLib-Ruby:如何在 DB 中设置 ID3 标签
【发布时间】:2012-06-03 20:58:50
【问题描述】:

提前感谢您的帮助。

我想在我的数据库中设置 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) 做 |file| 标签 = file.id3v2_tag 标签.title 结尾 self.update_attribute!(:title => z) 结束

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

【问题讨论】:

    标签: ruby-on-rails id3 taglib-ruby


    【解决方案1】:

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

    接下来,下面一行:

    tag = file.id3v2_tag
    

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

    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

    【讨论】:

    • 我对如何设置数据然后将其设置在数据库中感到更加困惑。 'self.title => tag.title'。我是否在调用 file.save 之前设置它?我的想法是去 self.update_attributes(:title => tag.title) '# set data' 应该在哪里。
    • 我不想设置新的 id3 标签。我想从歌曲中提取 id3 标签并将其作为模型属性放入数据库中,这样我就可以轻松地将它们称为“master_song.title”。抱歉,如果之前不清楚。
    • 那我误解了你的问题,好吧。
    【解决方案2】:

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

    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?为我做的。回调很奇怪,但绝对有价值。希望这对其他人有帮助。

    【讨论】:

    • 您还应该检查tag 是否为零。还有为什么不直接在block中设置属性呢,通过self.title = tag.titleself.album = tag.album等方式
    • 好的。我改变了答案。你怎么看?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多