Javascript”;if语句“;和嵌入式ruby(ruby变量始终为true)

Javascript "if statement" and embedded ruby (ruby variable always true)

本文关键字:ruby 变量 true 嵌入式 if 语句 Javascript      更新时间:2023-09-26

我的html.erb:中有这样的脚本

if(browser == "Firefox") {
  $(".browser-warning").show();
}
else if(browser == "Safari") {
  if(browser.version < 6) {
    $(".browser-warning").show();
  }
}
else if((BrowserDetect.browser != "Chrome") && (<%= params[:section_id].to_s %> != '')) {
  console.log('yo');
  <%= session[:is_chrome] = false %>
  <%= Rails.logger.debug = "I made is_chrome false, wtf?" %>
}
else {
  $(".browser-warning").show();
}

我从Chrome浏览器运行这个脚本,条件返回false

但是会话[:is_chrome]总是变为false,Rails记录器返回"I made is_chrome false,wtf?"。但是。JS控制台记录器不会在控制台中打印"yo"。为什么会这样?只有当JS"if"语句为true时,定义会话值的正确方法是什么?

谢谢大家。

在服务器上,当渲染模板时,每个ruby片段都会得到评估
因此,这些行也会在服务器上执行(每次,不仅是在它不是chrome浏览器的情况下):

<%= session[:is_chrome] = false %>
<%= Rails.logger.debug = "I made is_chrome false, wtf?" %>

为了解决这个问题,你可以做以下操作之一:

  • 检查服务器是否为chrome浏览器,并进行必要的操作更改
  • 检查客户端是否为chrome浏览器,并制作ajax调用服务器以通知存在chrome(或非chrome)浏览器


此外,将<%= params[:section_id].to_s %>放在引号中(正如用户"注入"所述):

"<%= params[:section_id].to_s %>"

您需要了解rails在发送到浏览器之前正在呈现erb,并且在javascript运行其代码时没有erb语句。此外,rails在渲染文件时,会处理所有未被<%%>包围的内容作为纯文本,因此两个

<%= session[:is_chrome] = false %>
<%= Rails.logger.debug = "I made is_chrome false, wtf?" %>

总是被执行,而不管围绕它们编写什么样的javascript代码。

如果你想在客户端执行一些服务器端代码,唯一的方法就是发送另一个请求(通过Ajax,简单的选项),或者使用socketIO来启用客户端-服务器通信(从来没有自己做过:()

然而,您试图实现的目标可能严格在服务器端实现:看看这个问题

您需要在Ruby输出周围加引号:

"<%= params[:section_id].to_s %>"