Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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 3 ActiveRecord交易电子邮件_Ruby On Rails 3_Email_Transactions - Fatal编程技术网

Ruby on rails 3 ActiveRecord交易电子邮件

Ruby on rails 3 ActiveRecord交易电子邮件,ruby-on-rails-3,email,transactions,Ruby On Rails 3,Email,Transactions,我在rails 3应用程序中运行一个lib,它在不同的模型上执行多个插入和更新。这就像导入CSV购物列表文件,该文件可能会出现错误,从而中止导入功能 所以我有这样的想法: begin ActiveRecord::Base.transaction do @csv.each_with_index do |row, line_number| begin shopping_list_importer.import(row) rescue Exc

我在rails 3应用程序中运行一个lib,它在不同的模型上执行多个插入和更新。这就像导入CSV购物列表文件,该文件可能会出现错误,从而中止导入功能

所以我有这样的想法:

begin
  ActiveRecord::Base.transaction do
    @csv.each_with_index do |row, line_number|
      begin    
        shopping_list_importer.import(row)
      rescue Exception => e
        invalid_objects << {:message => e.message, :line_number => line_number+2}
      end
    end
    raise ActiveRecord::StatementInvalid if invalid_objects.present?
  end
rescue ActiveRecord::StatementInvalid
end
开始
ActiveRecord::Base.transaction do
@csv.each_与_索引do |行,行_编号|
开始
购物清单\进口商。导入(世界其他地区)
救援异常=>e
无效的\u对象e.message,:line\u number=>line\u number+2}
结束
结束
raise ActiveRecord::语句如果存在无效的\u对象,则无效。是否存在?
结束
rescue ActiveRecord::语句无效
结束
我的问题是,当创建一个新的购物清单项目时,它会向用户发送一封电子邮件。 当发生错误时,电子邮件已经发送,事务不会阻止发送。没关系,我理解为什么会发生这种情况,我应该在导入后发送电子邮件,但我的问题是,有没有更简单的方法来做到这一点并继续使用事务块

提前感谢,,
安德烈。

是什么触发了电子邮件的发送?如果您在保存后将其保存在回调中,如
,则如果对象未正确保存,它将不会发送任何电子邮件。比如:

after_save :send_notification

def send_notification
  UserNotifier.something.deliver
end
我刚刚发现:


看起来它应该能优雅地解决这类问题。

嗯,谢谢你的回复,但这就是我现在所拥有的。但是如果交易中出现任何错误,正确的元素已经发送了电子邮件。对。很抱歉我错过了。导入完成后推迟电子邮件发送如何?设置属性访问器:跳过通知即可。因此,在导入过程中,将该标志指定给对象,如果存在该标志,则不发送电子邮件。然后在成功导入后,通过导入的对象循环并触发
send_notification
方法。。。但导入后将需要此访问器。在某些情况下,我可能会有一个非常大的购物清单。我认为,我不应该使用访问器,而是应该有一个布尔“committed”列,它可以让我知道哪些列表提交时没有失败,并触发邮件方法发送到成功导入但尚未发送电子邮件的列表。发送后,我将提交的值更新为true,以便将它们标记为已发送。