[英]Rails: Why is my .each loop is being skipped?
我一次从API收到一条新消息。 每次收到新消息时,我都想在我的联系人模型中保存发件人的姓名(每个联系人在其中都属于_user:user,并具有电子邮件,senderRealname和重要性Points属性)。 对于每条消息,在将发件人另存为新联系人之前,我想检查当前用户的联系人以查看发件人是否已在联系人列表中,这样就不会保存任何重复的联系人。
由于某种原因,我检查联系人是否已经存在的循环被跳过,因此每封邮件的发件人都被保存为新联系人,无论它是否将是重复的联系人。
这是我的users_controller中的代码:
response.each do |m|
messageId = m['message_id']
body1 = m['bodies'][0]['content']
senderName = m['addresses']['from'][0]['email']
senderActualName = m['addresses']['from'][0]['name']
recieveTime = m['sent_at']
subjectText = m['subject']
isRead = m['flags']['seen']
hasReplied = m['flags']['answered']
importanceLevel = 0
@contact_already_exists = 0
@message_sender = senderName
puts 'RIGHT BEFORE CONTACTS'
@user.contacts.each do |c|
if c.email.to_s == @message_sender.to_s
importanceLevel = c.importancePoints
@contact_already_exists = 1
puts 'contact exists'
else
puts 'contact does not exist'
end
end
if @contact_already_exists == 1
puts 'No new contact'
elsif @contact_already_exists == 0
@newContact = Contact.new(email: senderName, realName: senderActualName, importancePoints: 0)
@newContact.user = current_user
@newContact.save
puts 'new contact saved'
end
end
-然后我用正常工作的消息做其他事情-
对于每条消息,先打印“先于联系人”文本,然后再打印“已保存新联系人”文本。 似乎整个循环都将跳过检查联系人是否存在的整个循环,因此@contact_already_exists永远不能设置为1。对不起,草率的变量名,仍然习惯于约定!
抱歉,我刚刚读了您的长评论。
是的, @user
是在外部循环之外设置的,因此在此循环的迭代中,不会从数据库中刷新/重新加载@user.contacts
。
您可以做两件事来解决此@user
在循环的每次迭代中重新加载@user
: @user.reload
以确保从数据库重新加载contacts
,或更改构建新Contact
的方式以使用关联,所以您的elsif
变成:
elsif @contact_already_exists == 0
@user.contacts.create(email: senderName, realName: senderActualName, importancePoints: 0)
puts "new contact saved"
虽然我原来的答复是没谱,它仍然是重要的检查,返回create
(或save
),或将其更改为!
另一种选择,因此引发了异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.