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

Что я здесь не так делаю? Обновление: 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

получить слишком большой уровень ошибки стека

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? сделал это для меня. Обратные вызовы странные, но, безусловно, ценные. Надеюсь, это поможет кому-то еще.

Прежде всего, убедитесь, что self.m_song.path это правильный путь, и что файл существует там.

Далее следующая строка:

tag = file.id3v2_tag

Не создает тег, если файл еще не имеет тега и поэтому может возвращать ноль. Установите для необязательного параметра "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

Другие вопросы по тегам