Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.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 在Active Mailer中循环通过数组的问题_Ruby On Rails_Arrays_Ruby_Email_Ruby On Rails 4.2 - Fatal编程技术网

Ruby on rails 在Active Mailer中循环通过数组的问题

Ruby on rails 在Active Mailer中循环通过数组的问题,ruby-on-rails,arrays,ruby,email,ruby-on-rails-4.2,Ruby On Rails,Arrays,Ruby,Email,Ruby On Rails 4.2,我正在尝试实现一个功能,允许用户发送一封电子邮件给多个收件人。我通过调用.split方法将收件人电子邮件参数拆分,该方法将其转换为一个数组。然后,我使用每个方法遍历数组,这些方法应该将mail方法应用于数组中的每个元素。控制器和邮件程序代码如下所示 控制器代码 def create @scoreboard = Scoreboard.find(params[:scoreboard_id]) @invitation = @scoreboard.sent_invitations.bu

我正在尝试实现一个功能,允许用户发送一封电子邮件给多个收件人。我通过调用
.split
方法将
收件人电子邮件
参数拆分,该方法将其转换为一个数组。然后,我使用每个方法遍历数组,这些方法应该将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
邮件代码

 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

问题是它只将电子邮件发送到数组中的最后一个元素。例如,如果用户在
中键入joe@example.com Mike@example.com“
在表单中,它将只向数组中的最后一个元素发送电子邮件。在这种情况下,
Mike@exapmle.com
。我不知道这是为什么。我想我是在正确地循环它。我不确定是什么导致了这个问题。我不确定是循环还是循环在活动邮件程序中不起作用。不太确定。任何帮助都将不胜感激。谢谢

试试这样的东西

创建具有字段的模型

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 => "xxx@yyy.com",:subject => "View Scoreboard") # Email is the model name. 
      email.deliver
      sleep(1)
  end 
end

通过这种方式,您还可以在模型中同时记录和发送所有邮件,还可以对电子邮件进行各种操作。

在发送邮件后尝试放置
sleep 1
。看看它是否有效。@Harry Bomrah抱歉,我从来没有使用过sleep 1,我应该把它放在哪里,谢谢。你为什么不使用
split\u email
作为
to:
的值呢?如果原因是,每封电子邮件必须分别发送给单个收件人,则必须在控制器中为每个收件人调用邮件程序。@Harry Bomrah不,这不起作用。它仍然发送到数组中的最后一个元素。您是否100%确定split_电子邮件是所有电子邮件的数组。你可能想检查它到底有什么。@Harry Bomrah好的,我就是这样做的。首先,我在“邀请控制器”中编写了这段代码@邀请=@invitation.recipient\u email.split'。然后它给了我以下的错误。[”的未定义方法“保存”divjot@example.com“,”库尔金德_d@hotmail.com“]:数组。它给了我一个错误,因为我有两个@invitation变量。然而,它向我透露,这是一个数组。我将@invitation变量更改为split_email。其他一切都没有改变。我把它移到了action mailer并运行了一个代码块来循环。如果你的split_电子邮件包含了所有的电子邮件,那就不起作用了。你检查了是什么吗?我会编辑我的答案,然后试试这个。你必须在控制器或助手中循环任何你喜欢的东西。