Проблемы Циклический просмотр массива в Active Mailer

Я пытаюсь реализовать функцию, которая позволяет пользователю отправлять одно электронное письмо нескольким получателям. Я разделяю параметры recipient email, вызывая метод .split, который превращает их в массив. Затем я перебираю массив с помощью метода each, который должен применять метод mail к каждому элементу массива. Код контроллера и почтовой программы приведен ниже.

код контроллера

 def create
    @scoreboard = Scoreboard.find(params[:scoreboard_id])
    @invitation = @scoreboard.sent_invitations.build(invitation_params)
    if @invitation.save
            UserMailer.registered_invitation_email(@scoreboard, @invitation).deliver_now
            flash[:success] = "Invitation sent successfully"
            redirect_to new_scoreboard_invitation_path
        else
            render 'new'
    end
    end
end

код почтовой программы

def registered_invitation_email(scoreboard, invitation)
     @scoreboard = scoreboard
     @invitation = invitation
     split_email = @invitation.recipient_email.split
     split_email.each do |email|
       mail(to: email, subject: "View scoreboard")
    end

  end

Проблема в том, что он отправляет электронное письмо только последнему элементу массива. Например, если пользователь введет "[email protected] [email protected]" в форму, электронное письмо будет отправлено только последнему элементу массива. В данном случае [email protected]. Я не уверен, почему это так. Я думаю, что я перебираю его правильно. Я не уверен, что вызывает проблему. Я не уверен, что это цикл или, возможно, циклы не работают в активной почтовой программе. Не совсем уверен. Любая помощь будет оценена по достоинству. Спасибо!!


person kpaul    schedule 25.11.2015    source источник
comment
Попробуйте поставить sleep 1 после отправки письма. посмотрите, работает ли это.   -  person Harry Bomrah    schedule 25.11.2015
comment
@Harry Bomrah Извините, но я никогда не использовал сон 1, где бы я это точно сказал, спасибо.   -  person kpaul    schedule 25.11.2015
comment
Почему бы вам не использовать split_email в качестве значения для to:? Если причина в том, что каждое электронное письмо должно идти к одному получателю отдельно, вы должны вызывать почтовую программу в контроллере для каждого получателя.   -  person Mareq    schedule 25.11.2015


Ответы (1)


Попробуйте что-нибудь вроде этого

Создайте модель с полями

field :mail_to
field :subject

создать метод в той же модели

def deliver
   UserMailer.send_invitation_mail(self).deliver
end

почтовая программа

def send_invitation_mail(email)
   mail(to: email.mail_to, subject: email.subject)
   email.destroy
end

Контроллер

def create
  user_emails.each do |email|
      email = Email.new(:mail_to => "[email protected]",:subject => "View Scoreboard") # Email is the model name. 
      email.deliver
      sleep(1)
  end 
end

Таким образом, вы также можете регистрировать и доставлять все письма вместе в модели, а также выполнять различные манипуляции с электронной почтой.

person Harry Bomrah    schedule 25.11.2015
comment
@ Гарри Бомра Нет, это не сработало. Он по-прежнему отправляет последний элемент в массиве. - person kpaul; 25.11.2015
comment
Вы на 100% уверены, что split_email — это массив всех писем. Вы могли бы хотеть проверить, что это имеет точно. - person Harry Bomrah; 25.11.2015
comment
@ Harry Bomrah Итак, вот как я это сделал. Сначала я написал этот код в контроллере приглашений. '@invitation = @invitation.recipient_email.split'. Затем это дало мне следующую ошибку. неопределенный метод «сохранить» для [[email protected], [email protected]]:Array. Это выдало мне ошибку, потому что у меня было две переменные @invitation. Однако мне стало известно, что это массив. Я изменил переменную @invitation на split_email. Больше ничего не изменилось. Я переместил его в почтовую программу и запустил блок кода в цикле. - person kpaul; 25.11.2015
comment
это не отвечает, если у ur split_email есть все электронные письма. Вы проверили, что это такое? - person Harry Bomrah; 25.11.2015
comment
я отредактирую свой ответ и попробую это. Вы можете зациклить контроллер или помощник, что вам нравится. - person Harry Bomrah; 25.11.2015