繁体   English   中英

Rails:为什么我的.each循环被跳过?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM