if else语句似乎同时运行

时间:2016-11-15 16:50:16

标签: javascript ruby-on-rails ruby if-statement erb

在我的js erb文件中,只有一个应该是我的两个flash消息。 ajax运行良好,我的反应是应该的。但是,出于某种原因,我的flash消息在if和else语句中都会显示消息。我在if语句之前放置了一个调试器来测试我的响应,它应该被评估为true。

$.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];

2 个答案:

答案 0 :(得分:1)

ruby内的任何javascript代码(显然都在ruby标记内)将始终执行,无论if条件如何。

相反,您可以在控制器中设置flash消息,或者如果您想在当前页面中显示错误/成功消息,那么请使用JS代码 $(your-element).text("your-text")

答案 1 :(得分: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文本。

例如,假设您的页面上有以下标记,那将是&#34;占位符&#34;对于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");
  }
});