2016-11-15 98 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")