#ruby-on-rails #ruby #ruby-on-rails-4
Вопрос:
В настоящее время я работаю над билетом, в котором меня просят отфильтровать любое неактивное электронное письмо, которое будет отправлено получателю. Вот метод, над которым я работаю:
def self.delivering_email(message)
return if email_to_be_delivered?(message.subject)
email_list = message.to
if email_list.is_a?(String)
email_list = email_list.split(",").map(amp;:strip)
end
email_list.each { |email|
identity = Identity.find_by(email: email)
next if identity.nil?
# email_list.delete(email) unless identity.try(:preferred_user).active?
email_list.select(email) if identity.try(:preferred_user).active?
}
message.to = email_list
message.perform_deliveries = !email_list.empty?
end
«# список адресов электронной почты.удалить(по электронной почте) , если identity.try(:предпочтительный пользователь).активен?» Я прокомментировал это, потому что контроль качества упомянул, что ТОЛЬКО одно неактивное электронное письмо отфильтровывается и не полностью фильтрует другие неактивные электронные письма в массиве. Я предположил, что вместо .delete я должен использовать .выберите, но не знаю, работает ли это, потому что у меня нет никакого способа проверить и воспроизвести ошибку с моей стороны или как ее правильно реализовать.
Любая помощь будет оценена по достоинству.
Ответ №1:
Вы пытаетесь изменить массив во время итерации по нему, что может привести к странному поведению. Один из вариантов — просто использовать отдельный массив.
Поскольку вы уже выполняете итерацию, email_list.each
вы можете позвонить next
, если текущий email
результат вас не удовлетворяет, как вы уже делаете для identity.nil?
.
Так что это может выглядеть примерно так
valid_emails = []
email_list.each { |email|
identity = Identity.find_by(email: email)
next if identity.nil? || !identity.try(:preferred_user).active?
valid_emails << email
end
message.to = valid_emails