2015-10-22 29 views
1

新的rails,所以請原諒noob問題。通過AJAX捕獲電子郵件遇到了一些麻煩。Rails - 使用AJAX創建方法和響應的問題

所需的功能: 我創建一個登陸頁面爲我的網站,我們捕捉到的電子郵件(「信息」 =對象/模型)。我想要異步捕獲電子郵件,然後向用戶顯示感謝信息。如果用戶輸入無效的電子郵件,我想讓他們輸入正確的電子郵件。

我得到的工作 我可以正確捕獲電子郵件並通過AJAX執行驗證。如果我輸入無效的電子郵件,然後點擊「提交」,它不會顯示在/ leads/index上。如果我輸入了無效的電子郵件,它會顯示在/ leads/index上。

我沒有工作 我還沒有想出如何得到任何形式的回覆返回給用戶。如果保存成功,我想要做的就是更改h3(class =「results」)元素的文本。

我的代碼

landing.html.erb:

 <h3 class="results">Give us your e-mail and we'll send you an invite to beta when it's ready.</h3> 

     <%= form_for(:lead, remote: true, :url => {:controller => 'leads', :action => 'create'}, :html => {:class => 'form-inline emailForm'}) do |f| %> 
      <div class="form-group"> 
      <%= f.label(:email, 'E-mail', class: 'sr-only') %> 
      <%= f.text_field(:email, {:id => 'submitEmail2', :class=> 'form-lg', :placeHolder => 'E-mail Address'}) %> 
      </div> 
      <%= submit_tag("Sounds Good", {:id => 'submitEmail2', :class => 'btn btn-success btn-lg'}) %> 
     <% end %> 

leads_controller.rb

class LeadsController < ApplicationController 

    layout false 
    #respond_to :html, :js 

    def index 
    @leads = Lead.order("created_at ASC") 
    end 

    def show 
    end 

    def new 

    end 

    def create 
    @lead = Lead.new(lead_params) #Create a new object without form parameters 

    end 

    def edit 
    end 

    def delete 
    end 


    private 
    def lead_params 
     params.require(:lead).permit(:email) 
    end 
end 

create.js.erb

$('h3.results').html(""); 

//If I remove this code, it works 
<% if @lead.save? %> 
    $("h3.results").html("Thank you! We'll let you know when it's ready.")); 
    $('.emailForm').hide(); 
<% else %> 
    $("h3.results").html("Invalid E-mail. Please try again!")); 
<% end %> 

如果我刪除create.js.erb中的最後一段代碼,一切正常,並且h3中的文本被刪除。保存聲明有什麼問題?我是在保存在我的代碼的正確部分,還是應該在控制器中?

所有幫助表示讚賞!

+0

您使用的術語不建議新手。你在其他地方有編碼經驗嗎? –

+0

謝謝!在過去的幾年中,一堆不同語言的經驗讓人興奮不已。最後重新開始全職開發。 – CHawk

+0

堅持用Rails,你會發展得相當遠我想! –

回答

1

新建軌道

歡迎您!


我還沒有想出如何得到任何形式的回覆返回給用戶

Ajax反應是總是上完成的請求發回。

你如何處理它取決於你。

通過在瀏覽器中查看devloper consolenetwork選項卡,您將能夠看到答覆。在Chrome中,您將能夠right-click > Inspect Element > Network

enter image description here

,您就可以看到該請求被髮送,當您提交表單。


它不是在/引線/指數

你的問題是你的save功能顯示。

正如cweston提到的,你最好保存控制器行動本身的記錄(這具有直接訪問模型):

這將允許您使用以下(new_record?):

#app/views/leads/create.js.erb 
    <% message = @lead.new_record? "Invalid Email. Please try again!" : "Thank you! We'll let you know when it's ready" %> 
    $("h3.results").html("<%=j message %>"); 

    <% unless @lead.new_record? %> 
    $('.emailForm').fadeOut(500, function(){ 
     $(this).remove(); 
    }); 
    <% end %> 

這應該讓您能夠管理DOM中的HTML元素。


響應

在你的迴應,你使用內置的服務器端JS是偉大的事實的條款;我讚賞這一點。

其他你可以處理你的迴應的方式是使用客戶端Ajax。你並不需要這樣做,因爲你使用了Rails UJS驅動程序,但這裏是你會怎麼做吧:

#app/assets/javascripts/application.js 
$(document).on("submit", "form#new_lead", function(e) { 
    $.ajax({ 
     url: $(this).attr("action"), 
     data: $(this).serialize(), 
     success: function(data) { 
      // stuff here 
     }, 
     error: function(data) { 
     // stuff here 
     } 
    }); 
}); 
1

我相信你就行收到一個錯誤:

<% if @lead.save? %> 

你應該執行在控制器中保存:

def create 
    lead = Lead.new(lead_params) 
    @saved = lead.save 
end 

注意使用savesave?

然後,您可以測試@lead.save在您的視圖中是否成功,@saved

$('h3.results').html(""); 

<% if @saved %> 
    $("h3.results").html("Thank you! We'll let you know when it's ready.")); 
    $('.emailForm').hide(); 
<% else %> 
    $("h3.results").html("Invalid E-mail. Please try again!")); 
<% end %> 
+0

你能解釋爲什麼我必須使用'save'而不是'save'?是否在控制器最佳軌道練習中聲明變量? 不幸的是,它看起來像這個錯誤比我想象的更爲不明朗。問題是在我聲明h3 -_- – CHawk

+0

的行尾有分號之前的雙括號,否則你會得到一個「NoMethodError(未定義的方法'save#'for #Lead <0x007fbe31320f18>」。已定義,您可以查看[documentation here](http://apidock.com/rails/ActiveRecord/Base/save) – cweston

0

回答 我是個白癡。該錯誤是因爲我的$('h3.results')調用結束時出現了雙括號。