rails模型保存未提交,但没有错误

时间:2012-11-16 22:25:56

标签: ruby-on-rails

rails 3.2.8

我尝试创建一个简单的多态Log模型作为可记录。该表只有一个字段log,它被设想为一个时间戳,一条短消息将附加到has_one关系。

我的问题是,在创建记录后,我似乎无法获取要追加和保存的消息。调试显示它已提交并且记录已更改,但重新加载后它将恢复为原始版本。我一直在寻找这种方式,现在是时候看看是否有其他人看到了愚蠢的东西。

模型的相关部分:

class Log < ActiveRecord::Base
  belongs_to :logable, :polymorphic => true
  attr_accessible :logable_id, :log, :logable_type

  def set_log(entry)
    self.log << "\r\n#{Time.now.to_s} - #{entry}"
    self.save    
  end
end

class Candidate < ActiveRecord::Base
  attr_accessible :citizen_id, :commitment_id, :current_stage, :current_status
  has_one :log, :as => :logable

  def append_log(entry)
    if self.log.nil?
      self.build_log( :log => "#{Time.now.to_s} - Log Created")
      self.log.save
    end
    self.log.set_log(entry)
  end
end

下面是我获得候选人的控制台日志,查看日志(仅限原始创建的条目),附加一个条目,显示实例中所做的更改。重新加载日志记录,更改消失。

1.9.2-p136 :001 > c = Candidate.find(1)
  Candidate Load (15.1ms)  SELECT "candidates".* FROM "candidates" WHERE "candidates"."id" = ? LIMIT 1  [["id", 1]]

1.9.2-p136 :002 > c.log
  Log Load (0.1ms)  SELECT "logs".* FROM "logs" WHERE "logs"."logable_id" = 1 AND "logs"."logable_type" = 'Candidate' LIMIT 1
 => #<Log id: 1, logable_id: 1, logable_type: "Candidate", log: "2012-11-16 15:23:49 -0600 - Log Created", created_at: "2012-11-16 21:23:49", updated_at: "2012-11-16 21:23:49"> 

1.9.2-p136 :003 > c.append_log("Add entry")
LOG BEFORE 2012-11-16 15:23:49 -0600 - Log Created
   (0.1ms)  begin transaction
   (0.1ms)  commit transaction
LOG APPENDED 2012-11-16 15:23:49 -0600 - Log Created
2012-11-16 16:05:53 -0600 - Add entry
NOTE Log field has been appended
 => nil 

1.9.2-p136 :004 > c.log
 => #<Log id: 1, logable_id: 1, logable_type: "Candidate", log: "2012-11-16 15:23:49 -0600 - Log Created\r\n2012-11-16...", created_at: "2012-11-16 21:23:49", updated_at: "2012-11-16 21:23:49">

NOTE Now reload the log record
1.9.2-p136 :005 > l = Log.find(1)
  Log Load (0.3ms)  SELECT "logs".* FROM "logs" WHERE "logs"."id" = ? LIMIT 1  [["id", 1]]
 => #<Log id: 1, logable_id: 1, logable_type: "Candidate", log: "2012-11-16 15:23:49 -0600 - Log Created", created_at: "2012-11-16 21:23:49", updated_at: "2012-11-16 21:23:49"> 
NOTE The add entry line is gone!

我不知道这是否与has_one关系有关,但即使我只是用日志记录调用set_log,at似乎要追加,但重新加载没有更改。

难倒史蒂夫

2 个答案:

答案 0 :(得分:2)

尝试

self.save!

如果有任何

,应该引发错误

你也可以提出自己的例外或像

一样做魔术
if !self.save
  raise "attempt to save failed"
end

答案 1 :(得分:1)

您是否正在显示所有rails日志?在您调用c.append_log之后,我希望看到UPDATE SQL日志条目,但没有一个。这表明self.save中的set_log失败了。在.errors上吐出c.log,看看验证是否失败......

原来这是因为<<不会扭曲脏属性位。

<<更改为+=应该可以解决问题。

self.log += "\r\n#{Time.now.to_s} - #{entry}"