if else 语句同时出现 运行

if else statement appears to run both

在我的 js erb 文件中,当只有一个应该显示时,我的两个闪存消息都显示了。 ajax 运行良好,我的回应是应该的。但是,出于某种原因,我的即显消息在 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];

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

相反,您可以在控制器中设置 flash 消息,或者如果您想在当前页面显示 error/success 消息,则使用 JS 代码代替 $(your-element).text("your-text")

由于 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 文本的 "placeholder":

<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");
  }
});