Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 需要从验证写入数据库_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 需要从验证写入数据库

Ruby on rails 需要从验证写入数据库,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,在我的模型中,我有一个自定义的验证方法,可以将请求发送到外部服务。根据响应,我将错误添加到errors数组(如果有) 如果有错误,我还需要创建表示错误日志的ErrorLog模型的新记录。问题是,当验证失败时,它会对数据库执行回滚,所有新的错误日志记录都会丢失。实施它的最佳方式是什么 我还应该说,由于某种原因,after\u rollback没有被调用。after\u rollback只在事务期间保存或销毁的对象上被调用。您是在主类上还是在ErrorLog类上设置after\u rollback回

在我的模型中,我有一个自定义的验证方法,可以将请求发送到外部服务。根据响应,我将错误添加到
errors
数组(如果有)

如果有错误,我还需要创建表示错误日志的
ErrorLog
模型的新记录。问题是,当验证失败时,它会对数据库执行
回滚
,所有新的
错误日志
记录都会丢失。实施它的最佳方式是什么


我还应该说,由于某种原因,
after\u rollback
没有被调用。

after\u rollback
只在事务期间保存或销毁的对象上被调用。您是在主类上还是在
ErrorLog
类上设置
after\u rollback
回调

事实上,对
ErrorLog
类使用
after_rollback
回调似乎是最简单的方法。您将丢失
ErrorLog
实例的唯一情况是,如果事务被回滚,那么类似这样的操作应该会起作用:

class MyClass < ActiveRecord::Base
  before_save :check_external

  def check_external
    unless external_says_i_am_okay?
      ErrorLog.create!(:message => 'oops')
    end
  end
end

class ErrorLog < ActiveRecord::Base
  after_rollback :save_anyway

  def save_anyway
    self.save!
  end
end
classmyclass'oops')
结束
结束
结束
类ErrorLog

当然,已经说过了所有可能要考虑获得外部服务来验证模型的性能。例如,如果您在web请求的范围内创建对象,则速度可能不够快。您还需要确保
ErrorLog#save
不会失败,因为此时您将超出事务范围。

谢谢您的帮助。我理解我的错误,并在回滚后在
ErrorLog
模型内部设置
。但是
self.save什么都不要做。我在日志中有
SQL(0.1ms)BEGIN\n SQL(0.1ms)COMMIT
,没有任何插入。我想知道它是否认为它已经保存了,因为它是在事务本身中“保存”的。您可能希望尝试对其调用
touch
,或者更改一个属性,以查看该属性是否会推动保存进入生命。值得检查的是,登录到那里的用户肯定正在调用回调。仅使用ErrorLog.create!(self.attributes)我可以确认错误已被保存。这看起来像是肮脏的黑客,但我不知道,还能做什么。谢谢你的帮助。