2014-07-25 56 views
3

我正在開發一個具有聯繫表單的應用程序。這是一個單頁的應用程序,我在後端使用rails,在前端使用angular(不適用於表單)和bootstrap。我正在嘗試使用ajax,因此我不必刷新頁面。當我剛剛用rails提交(使用Mailform)時,它看起來像在工作。用rails 4,郵件表單和ajax發送郵件?

當我進入console並鍵入;

c = Contact.new(:name => "name", :email => "[email protected]", :message => "hi") 

c.deliver 

在控制檯中,我得到;

Rendered vendor/bundle/gems/mail_form-1.5.0/lib/mail_form/views/mail_form/contact.erb (2.9ms) 

MailForm::Notifier#contact: processed outbound mail in 29.2ms 

Sent mail to [EMAIL] (5.1ms) 
Date: Fri, 25 Jul 2014 14:52:20 -0700 
From: Name <[email protected]> 
To: [EMAIL] 
Message-ID: <[email protected]> 
Subject: Onyx Contact Form 
Mime-Version: 1.0 
Content-Type: text/html; 
charset=UTF-8 
Content-Transfer-Encoding: 7bit 

<h4 style="text-decoration:underline">Onyx Contact Form</h4> 


    <p><b>Name:</b> 
    Name</p> 

    <p><b>Email:</b> 
    [email protected]</p> 

    <p><b>Message:</b> 
    Hi</p> 


=> true 

看起來像是在工作。但是,我不確定是否僅僅是因爲我沒有收到我的電子郵件(但也許電子郵件不會本地發送?)。當我嘗試使用ajax提交併按下「提交」時,沒有任何反應,所以我知道我的JavaScript不正確。

下面是我的代碼的其餘部分;

index.html.erb

<div class="row"> 
    <%= bootstrap_form_for @contact ||= Contact.new do, remote: true |f| %> 
    <div class="inner"> 
     <div class="col-md-7" id="form"> 
      <%= f.text_field :name, :required => true, :hide_label => true, :placeholder => "Name" %> 
      <%= f.text_field :email, :required => true, :hide_label => true, :placeholder => "Email" %> 
      <%= f.text_area :message, size: "60x10", :required => true, :hide_label => true, :plceholder => "Hello, we'd love to work with you" %> 

      <%= f.submit 'Send Message', class: 'custom-button' %> 
     </div> 
    </div> 
    </div> 

contact.rb

class Contact < MailForm::Base 
    attribute :name,  :validate => true 
    attribute :email,  :validate => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i 
    attribute :message 
    attribute :nickname, :captcha => true 

    # Declare the e-mail headers. It accepts anything the mail method 
    # in ActionMailer accepts. 
    def headers 
    { 
     :subject => "Onyx Contact Form", 
     :to => "[MY_EMAIL]", 
     :from => %("#{name}" <#{email}>) 
    } 
    end 
end 

contacts_controller.rb

class ContactsController < ApplicationController 
    def new 
    @contact = Contact.new 
    end 

    def create 
    @contact = Contact.new(params[:contact]) 
    @contact.request = request 
    if @contact.deliver 
     flash[:notice] = 'Thank you for your message. We will contact you soon!' 
     redirect_to root_url 
    else 
     flash.now[:error] = 'Cannot send message.' 
     render :new 
    end 
    end 
end 

個main.js

$(function(){ 
    $("#form").submit(function(){ 
     var dataSet = $(this).serialize(); 
     $.ajax({ 
      type: "POST", 
      url: $(this).attr("action"), 
      data: dataSet, 
      complete: function(){ 
       alert("Sent!"); 
      }, 
      error: function(){ 
       alert("Something went wrong!"); 
      } 
     }); 
     return false; 
    }); 
}) 

的routes.rb

match '/contacts', to: 'contacts#new', via: 'post' 
resources :contacts, as: 'home' #home so it doesn't go to another page 

我還添加了在我從其他SO答案找到配置文件的一些東西,我不知道,如果是做任何事情或不。通常我不會使用ajax來提交表單,但是因爲它是單個頁面,所以路由到另一個頁面並不是真正的選擇。如果使用郵件表單太困難了,也許Action Mailer是一個更好的選擇?任何幫助指出我在正確的方向將不勝感激。

回答

4

第一步,添加此config.action_mailer.perform_deliveries = trueconfig/environments/development.rb

這樣,您可以在開發模式下發送電子郵件。

第二步軌道4使用strong parameters,這意味着你需要whilelist您的參數,以便在控制器中添加下面的方法:

def contacts_params 
    params.require(:contact).permit(:name, :email, :message) 
end 

然後改變這一行@contact = Contact.new(params[:contact])@contact = Contact.new(contacts_params)

請做嘗試這些更改。

編輯:不是

在你的路由你打電話給「新接觸#」「接觸#創建」所以達不到你的代碼。

另外,如果您不需要remote: true,因爲您正在處理提交的東西

+0

謝謝!我向development.rb添加了一些配置設置,並添加了您推薦的行。在我的終端中,當我輸入與上述問題相同的命令時,它向我發送了一封電子郵件。但是,在本地主機上,當我使用我的聯繫表單來查看它是否正常工作時,它並沒有給我發送電子郵件。所以它在控制檯上工作,但不是從窗體上。 – user3749994

+0

我沒有在回答一些變化,請大家看看,做一個新的嘗試 – Aguardientico

+0

咄!哈哈謝謝你。那是我的錯誤。 – user3749994