2016-11-15 130 views
0

在我的js erb文件中,當我只有一個應該是時,我的兩個flash消息都顯示出來。阿賈克斯運行良好,我的迴應是它應該是。但是,出於某種原因,我的flash消息在if和else語句中都會顯示消息。我在if語句之前放置了一個調試器來測試我的響應,並且它的評估結果爲true。if else語句似乎同時運行

$.ajax({ 
      url: '/purchases/options', 
      method: 'post', 
      dataType: 'json', 
      data: data 
      }).done(function(response){ 
       if(response.duplicate === "true"){ 
        <% flash.now[:alert]= 'This Addressi Is Already In Your Cart Or In Your Report Section.' %> 
       } 
       else{ 

        <% flash.now[:notice]= 'Searchs result is added to your cart' %> 
       } 
      }); 
    $("<%= j render(:partial => 'layouts/messages') %>").insertBefore('form')[0]; 
+7

您需要了解服務器端代碼和客戶端代碼之間的區別。你不能那樣做。 – SLaks

+0

@SLaks我很抱歉,但請您詳細說明您的意思?我想根據我的迴應輸出不同的閃光消息。 – beewuu

回答

1

由於ERB總是會得到插值它發送給瀏覽器,瀏覽器基本上是要看到這一點:

if(response.duplicate === "true") { 
} else { 
} 

你的服務器會看到這一點:

flash.now[:alert]= 'This Addressi Is Already In Your Cart Or In Your Report Section.' 
flash.now[:notice]= 'Searchs result is added to your cart' 

這基本上意味着您的服務器將始終運行這兩個這些flash行。

你需要做的是在沒有ERB的幫助的情況下將所有內容移動到JS文件中,然後在那裏手動設置Flash文本。

例如,假設你有你的頁面上的以下標記的地方,這將是「佔位符」爲Flash文本:

<div id="flash"></div> 

然後在JavaScript中,您只需將手動設置文本:

$("<%= j render(:partial => 'layouts/messages') %>").insertBefore('form')[0]; 

$.ajax({ 
    url: '/purchases/options', 
    method: 'post', 
    dataType: 'json', 
    data: data 
}).done(function(response){ 
    if (response.duplicate === "true") { 
    $("#flash").text("This Addressi Is Already In Your Cart Or In Your Report Section."); 
    $("#flash").addClass("alert"); 
    } else{ 
    $("#flash").text("Searchs result is added to your cart"); 
    $("#flash").addClass("notice"); 
    } 
}); 
+0

非常好說。非常感謝!這使得它更加清晰 – beewuu

1

不限ruby代碼(顯然紅寶石標記內)的內部javascript將總是被執行,而不管if條件。

而是可以在控制器設置flash消息,或者如果你想顯示在當前頁面的錯誤/成功的消息,然後用JS代碼,而不是像 $(your-element).text("your-text")