2016-08-03 126 views
0

我正嘗試在RoR中創建一個系統發送電子郵件,我希望用戶能夠做的是通過表單上的複選框選擇多個電子郵件地址,並通過每個選中的複選框發送電子郵件每一個。當時用戶可以在表格上選擇多個電子郵件地址,並且系統將它們結合在一起,以便將一封電子郵件發送給多個收件人,例如,用戶選擇電子郵件地址「1 @ a.com」和「2 @ b.com」,並且系統發送電子郵件到「1 @ a.com; 2 @ b.com」。Ruby on Rails:通過電子郵件地址的複選框循環併發送電子郵件給每個?

我已經通過視圖做到了這一點:

<%= form_for(@email) do |f| %> 
    <% if @email.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@email.errors.count, "error") %> prohibited this email from being saved:</h2> 

     <ul> 
     <% @email.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <p> 
    <%= f.label :from_name %><br> 
    <% if @user.present? %> 
    <%= f.select :from_name, [@user.firstname + " " + @user.surname, @user.organisation] %> 
    <% end %> 
    </p> 

    <p> 
    <%= f.label :From_Email_Address %><br> 
    <%= f.collection_select :account_id, Account.where(user_id: session[:user_id]), 
     :id,:email %> 
    </p> 

    <p> 
    <%= f.label :to %><br> 
    <%= f.collection_check_boxes(:to, @contacts, :email, :email) %> 
    </p> 

    <p> 
    <%= f.label :cc %><br> 
    <%= f.text_field :cc %> 
    </p> 

    <p> 
    <%= f.label :bcc %><br> 
    <%= f.text_field :bcc %> 
    </p> 

    <p> 
    <%= f.label :subject %><br> 
    <%= f.text_field :subject %> 
    </p> 

    <p> 
    <%= f.label :message %><br> 
    <%= f.text_field :message %> 
    </p> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 

隨着顯示每個保存在聯繫人數據庫表中的電子郵件地址的複選框行<%= f.collection_check_boxes(:to, @contacts, :email, :email) %>

這然後通過對emails_controller,其具有下面的代碼變爲:

class EmailsController < ApplicationController 
    before_action :set_email, only: [:show, :edit, :update, :destroy] 

    def index 
    # Only show the email accounts for the user logged in 
    @emails = Email.where(user_id: session[:user_id]) 
    end 

    def show 
    end 

    def new 
    @user = User.find(session[:user_id]) 
    @contacts = Contact.where(user_id: session[:user_id]) 
    @email = Email.new 
    end 

    def edit 
    @user = User.find(session[:user_id]) 
    @contacts = Contact.where(user_id: session[:user_id]) 
    end 

    def create 
    @email = Email.new(email_params) 
    @email.user_id = session[:user_id] 
    @user = session[:user_id] 
    if @email.save 
     UserEmails.send_email(@email).deliver_now 
     redirect_to @email, notice: 'Email was successfully created.' 
    else 
     redirect 'new' 
    end 
    end 

    def update 
     if @email.update(email_params) 
     redirect_to @email, notice: 'Email was successfully updated.' 
     else 
     redirect 'edit' 
     end 
    end 

    def destroy 
    @email.destroy 
    redirect_to emails_url, notice: 'Email was successfully destroyed.' 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_email 
      @email = Email.find(params[:id]) 
end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def email_params 
     res = params.require(:email).permit(:account_id, :cc, :bcc, :subject, :message, :from_name, to: []) 
     res[:to] = res[:to].join('; ') 
     res 
    end 
end 

隨着email_params代碼接合的電子郵件地址與所選擇在一起的「;」每一個之間。

正如您在create方法中看到的那樣,保存電子郵件後會運行代碼UserEmails.send_email(@email).deliver_now - 此代碼將發送電子郵件。

所以,我的問題是,是否有人可以幫助我更改代碼,以便將一封電子郵件發送到表單上選定的每個電子郵件地址?

下面是我的形式與複選框的樣子。

enter image description here

回答

0

使用多重選擇框,然後選擇2製作的電子郵件地址選擇框,就像谷歌確實是下面的代碼工作

你的形式

<div class="form-group"> 
 
       <%= f.label :select_user_email %><br/> 
 
       <select class="form-control select2" name="user[email][]"> 
 
       <option value="" selected disabled>Enter email address</option> 
 
       <%@users.each do |user|%> 
 
        <option value="<%=user.email%>"><%=user.name%></option> 
 
       <%end%> 
 
       </select> 
 
      </div>

def create 
    @emails = (params[:email]).split(",") 
    @emails.each do |email| 
    UserMailer(email, @message).deliver_now 
end 
end 

記住選擇2是使選擇框這樣 enter image description here

+0

嗨普拉迪普,當你說「使用多個選擇框」一個JavaScript和CSS,你的意思是添加一個複選框每個電子郵件地址而不是使用'collection_check_boxes'? –

+0

好的,感謝您的編輯,但我看不到選擇中顯示的聯繫人的電子郵件地址?即我能看到的唯一的價值是「輸入電子郵件地址」,由於某些原因電子郵件不通過。任何想法爲什麼? –

+0

有沒有辦法使用複選框來做到這一點? –

相關問題