ruby-on-rails - 微型模型操作后,Rails 不会保存到数据库

标签 ruby-on-rails ruby

我目前正在编写我的第一个 Rails 应用程序,但无法解决这个恼人的错误。

我想做什么:该应用已连接到用户的保管箱帐户。用户可以指定应用随后查找音频文件的路径。然后下载这些音频文件,将元数据、路径等保存到数据库中属于相应用户的歌曲模型中。

几周前,我实现了一种方法来索引 Dropbox 文件夹并保存文件名和直接链接。现在我添加了一行,将整个保管箱路径也保存到数据库中,突然间什么都没有保存了。

这是我的歌曲模型的样子:

require "dropbox_helper"
require "open-uri"

class Song < ActiveRecord::Base
  belongs_to :user
  attr_accessible :artist, :expiration, :is_cached, :length, :dropbox_link, :local_path, :title, :dropbox_path

  validates_presence_of :title, :is_cached, :dropbox_link, :dropbox_path
  #validates :dropbox_path, :uniqueness => true

  def self.fetch_basic_songdata(user)
    logger.info "++++DEBUG: Song#fetch_basic_songdata started"
    dbh = DropboxHelper.new(user.dropbox_access_key, user.dropbox_access_secret, user.dropbox_folder)
    logger.info "++++DEBUG: DropboxHelper initialized"
    songs_metadata = dbh.generate_audio_index
    logger.info "++++DEBUG: Metadata generated"
    #logger.debug songs_metadata.inspect
    songs_metadata.each do |smd|
      logger.info "Preparing song #{smd['path']} for saving"
      songdata = dbh.song_data(smd)
      user.songs.create do |s|
        s.title = songdata['filename']
        s.dropbox_path = songdata['path']
        s.dropbox_link = songdata['link']
        s.is_cached = false
        logger.info "Song #{s[:title]} generated"
        logger.info "Song #{s[:title]} saved to the data base"
      end
    end
  end

end

现在,当我在 Rails 控制台中调用 Song.fetch_basic_songdata(User.find(1)) 时,它会打印以下内容:

irb(main):002:0> Song.fetch_basic_songdata(User.find(1))
  User Load (59.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
Song#fetch_basic_songdata started
Preparing song /audiomixer/01 - Paradise.mp3 for saving
   (0.1ms)  begin transaction
Song 01 - Paradise.mp3 generated
Song 01 - Paradise.mp3 saved to the data base
   (0.1ms)  commit transaction
Preparing song /audiomixer/02 - Weirdo.mp3 for saving
   (0.1ms)  begin transaction
Song 02 - Weirdo.mp3 generated
Song 02 - Weirdo.mp3 saved to the data base
   (0.2ms)  commit transaction
Preparing song /audiomixer/03 - As It Is When It Was.mp3 for saving
   (0.1ms)  begin transaction
Song 03 - As It Is When It Was.mp3 generated
Song 03 - As It Is When It Was.mp3 saved to the data base
   (0.1ms)  commit transaction
Preparing song /audiomixer/04 - Broken Promise.mp3 for saving
   (0.2ms)  begin transaction
Song 04 - Broken Promise.mp3 generated
Song 04 - Broken Promise.mp3 saved to the data base
   (0.1ms)  commit transaction
Preparing song /audiomixer/05 - Way Of Life.mp3 for saving
   (0.1ms)  begin transaction
Song 05 - Way Of Life.mp3 generated
Song 05 - Way Of Life.mp3 saved to the data base
   (0.1ms)  commit transaction
Preparing song /audiomixer/06 - Bizarre Love Triangle.mp3 for saving
   (0.1ms)  begin transaction
Song 06 - Bizarre Love Triangle.mp3 generated
Song 06 - Bizarre Love Triangle.mp3 saved to the data base
   (0.1ms)  commit transaction
Preparing song /audiomixer/07 - All Day Long.mp3 for saving
   (0.1ms)  begin transaction
Song 07 - All Day Long.mp3 generated
Song 07 - All Day Long.mp3 saved to the data base
   (0.1ms)  commit transaction
Preparing song /audiomixer/08 - Angel Dust.mp3 for saving
   (0.1ms)  begin transaction
Song 08 - Angel Dust.mp3 generated
Song 08 - Angel Dust.mp3 saved to the data base
   (0.1ms)  commit transaction
Preparing song /audiomixer/09 - Every Little Counts.mp3 for saving
   (0.1ms)  begin transaction
Song 09 - Every Little Counts.mp3 generated
Song 09 - Every Little Counts.mp3 saved to the data base
   (0.1ms)  commit transaction
Preparing song /audiomixer/10 - State Of The Nation.mp3 for saving
   (0.1ms)  begin transaction
Song 10 - State Of The Nation.mp3 generated
Song 10 - State Of The Nation.mp3 saved to the data base
   (0.0ms)  commit transaction
=> [#<Dropbox::API::File bytes=3710598 client_mtime="Fri, 23 Jul 2010 00:09:30 +0000" icon="page_white_sound" is_dir=false mime_type="audio/mpeg" modified="Mon, 22 Apr 2013 12:27:54 +0000" path="/audiomixer/01 - Paradise.mp3" rev="4b6ad8fc0010df0f" revision=1265293564 root="dropbox" size="3.5 MB" thumb_exists=false>, #<Dropbox::API::File bytes=3731496 client_mtime="Fri, 23 Jul 2010 00:09:30 +0000" icon="page_white_sound" is_dir=false mime_type="audio/mpeg" modified="Mon, 22 Apr 2013 12:27:54 +0000" path="/audiomixer/02 - Weirdo.mp3" rev="4b6ad8fd0010df0f" revision=1265293565 root="dropbox" size="3.6 MB" thumb_exists=false>, #<Dropbox::API::File bytes=3620319 client_mtime="Sun, 10 Jan 2010 19:50:28 +0000" icon="page_white_sound" is_dir=false mime_type="audio/mpeg" modified="Mon, 22 Apr 2013 12:27:54 +0000" path="/audiomixer/03 - As It Is When It Was.mp3" rev="4b6ad8fa0010df0f" revision=1265293562 root="dropbox" size="3.5 MB" thumb_exists=false>, #<Dropbox::API::File bytes=3645815 client_mtime="Sun, 10 Jan 2010 19:50:28 +0000" icon="page_white_sound" is_dir=false mime_type="audio/mpeg" modified="Mon, 22 Apr 2013 12:27:54 +0000" path="/audiomixer/04 - Broken Promise.mp3" rev="4b6ad8fb0010df0f" revision=1265293563 root="dropbox" size="3.5 MB" thumb_exists=false>, #<Dropbox::API::File bytes=3954295 client_mtime="Sat, 20 Apr 2013 07:09:30 +0000" icon="page_white_sound" is_dir=false mime_type="audio/mpeg" modified="Mon, 22 Apr 2013 12:27:54 +0000" path="/audiomixer/05 - Way Of Life.mp3" rev="4b6ad8fe0010df0f" revision=1265293566 root="dropbox" size="3.8 MB" thumb_exists=false>, #<Dropbox::API::File bytes=4199193 client_mtime="Sun, 10 Jan 2010 19:50:28 +0000" icon="page_white_sound" is_dir=false mime_type="audio/mpeg" modified="Mon, 22 Apr 2013 12:27:54 +0000" path="/audiomixer/06 - Bizarre Love Triangle.mp3" rev="4b6ad8ff0010df0f" revision=1265293567 root="dropbox" size="4 MB" thumb_exists=false>, #<Dropbox::API::File bytes=5002092 client_mtime="Sun, 10 Jan 2010 19:50:28 +0000" icon="page_white_sound" is_dir=false mime_type="audio/mpeg" modified="Mon, 22 Apr 2013 12:27:54 +0000" path="/audiomixer/07 - All Day Long.mp3" rev="4b6ad9010010df0f" revision=1265293569 root="dropbox" size="4.8 MB" thumb_exists=false>, #<Dropbox::API::File bytes=3595686 client_mtime="Sat, 20 Apr 2013 07:09:31 +0000" icon="page_white_sound" is_dir=false mime_type="audio/mpeg" modified="Mon, 22 Apr 2013 12:27:54 +0000" path="/audiomixer/08 - Angel Dust.mp3" rev="4b6ad8f90010df0f" revision=1265293561 root="dropbox" size="3.4 MB" thumb_exists=false>, #<Dropbox::API::File bytes=4307888 client_mtime="Sat, 20 Apr 2013 07:09:32 +0000" icon="page_white_sound" is_dir=false mime_type="audio/mpeg" modified="Mon, 22 Apr 2013 12:27:54 +0000" path="/audiomixer/09 - Every Little Counts.mp3" rev="4b6ad9000010df0f" revision=1265293568 root="dropbox" size="4.1 MB" thumb_exists=false>, #<Dropbox::API::File bytes=6313648 client_mtime="Sun, 10 Jan 2010 19:50:28 +0000" icon="page_white_sound" is_dir=false mime_type="audio/mpeg" modified="Mon, 22 Apr 2013 12:27:54 +0000" path="/audiomixer/10 - State Of The Nation.mp3" rev="4b6ad9020010df0f" revision=1265293570 root="dropbox" size="6 MB" thumb_exists=false>]

检查是否保存了任何内容:

irb(main):003:0> Song.all
  Song Load (0.3ms)  SELECT "songs".* FROM "songs" 
=> []

我还注意到以 logger.info "++++DEBUG:[...]" 开头的行根本没有打印出来。在我插入它们之前,未打印下面的 logger.info 行。我真的不明白这种行为,你们中的任何人都可以帮忙吗?

PS:希望提供的信息足够。由于该应用的行为对我来说完全是随机的,所以我很难理解问题的本质。

编辑:感谢您的评论!按照建议,我尝试使用 create!。这是它告诉我的:

irb(main):002:0> Song.fetch_basic_songdata(User.find(1))
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
++++DEBUG: Song#fetch_basic_songdata started
++++DEBUG: DropboxHelper initialized
++++DEBUG: Metadata generated
Preparing song /audiomixer/01 - Paradise.mp3 for saving
   (0.1ms)  begin transaction
Song 01 - Paradise.mp3 generated
Song 01 - Paradise.mp3 saved to the data base
   (0.2ms)  rollback transaction
ActiveRecord::RecordInvalid: Validation failed: Is cached can't be blank
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/validations.rb:56:in `save!'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/attribute_methods/dirty.rb:33:in `save!'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/transactions.rb:264:in `block in save!'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/transactions.rb:208:in `transaction'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/transactions.rb:311:in `with_transaction_returning_status'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/transactions.rb:264:in `save!'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/associations/has_many_association.rb:14:in `insert_record'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/associations/collection_association.rb:436:in `block (2 levels) in create_record'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/associations/collection_association.rb:344:in `add_to_target'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/associations/collection_association.rb:434:in `block in create_record'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/associations/collection_association.rb:149:in `block in transaction'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/transactions.rb:208:in `transaction'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/associations/collection_association.rb:148:in `transaction'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/associations/collection_association.rb:433:in `create_record'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/associations/collection_association.rb:123:in `create!'
    from /var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/associations/collection_proxy.rb:46:in `create!'
    from /home/sloth/audiomixer/app/models/song.rb:21:in `block in fetch_basic_songdata'
    from /home/sloth/audiomixer/app/models/song.rb:18:in `each'
    from /home/sloth/audiomixer/app/models/song.rb:18:in `fetch_basic_songdata'
    from (irb):2
    from /var/lib/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start'
    from /var/lib/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start'
    from /var/lib/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `

因此,如果我对此的解释正确,问题是 is_cached 变量似乎是空白的(空?无?)。我假设这是由于在 s.is_cached = false 分配之前发生的错误。任何想法如何找到它?

此外,我只是注释了一些 logger.info 行并添加了新行。重新启动服务器后,我再次尝试并打印了我评论的行,但没有新的。我是否缺少有关使用旧文件的 Rails 的一些非常重要的信息?在过去的几周里,我一直在做同样的事情,但从未经历过任何如此奇怪的经历。

最佳答案

您不应将 validates_presence_of 与 bool 属性一起使用,因为它会通过调用 blank? 方法来检查该属性是否存在。但是,false.blank? 是 true,因此当属性为 false 时它永远不会让您保存记录。

您可能还想注意 Rails 控制台不会自动选择您对代码所做的更改。您需要调用 reload! 或重新启动控制台。使用 reload! 时,请注意在调用 reload 之前没有创建对象的实例!闲逛 - 他们可能指的是该类(class)的先前版本。

关于ruby-on-rails - 微型模型操作后,Rails 不会保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16342142/

相关文章:

ruby-on-rails - 为什么post方法似乎清除了我的Rails session 数据?

javascript 函数不适用于 Rails

ruby-on-rails - Bundler 安装看似不需要的 gem

ruby-on-rails - Rails 3(Ruby 1.9.2 vs 1.8.6)和(MRI vs REE vs JVM)——评论/建议?

javascript - 多个 ajax 获取数据轨的替代方案

ruby-on-rails - PG::UnableToSend: 没有连接到 Rails 中的服务器

ruby-on-rails - 如何检查模型是否具有特定的列/属性?

ruby-on-rails - 如何在不替换第一个哈希的情况下合并哈希的哈希

ruby - 如何将 stderr 和 stdout 重定向到 Ruby 脚本文件?

ruby - 是否可以将命名空间方法添加到 Ruby 中的现有类中?