1

事前に助けてくれてありがとう。

モデル MasterSong の属性としてデータベースに id3 タグ データを設定したいと考えています。具体的には、タイトル、アーティスト、アルバムです。

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

スタック レベルが深すぎるというエラーが表示されるようになりました。

4

2 に答える 2

6

まず、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

于 2012-06-04T10:54:53.187 に答える
1

わかった!だから私は遊んで、遊んで、遊んだ後、それをしました。

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を追加しますか?私のためにそれをしました。コールバックは奇妙ですが、間違いなく価値があります。これが他の誰かに役立つことを願っています。

于 2012-06-05T00:21:23.313 に答える