Javascript”;if语句“;和嵌入式ruby(ruby变量始终为true)
Javascript "if statement" and embedded ruby (ruby variable always true)
我的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 %>"
相关文章:
- 将javascript变量分配给ruby变量
- 如何在 erb 模板中递增 Ruby 变量
- jquery显示/隐藏块中的Ruby变量
- 在事件触发后使用 ruby 变量
- 在 htnl.erb 文件中将 ruby 变量添加到 javascript
- 在 Java 脚本 if-else 块中设置 Ruby 变量
- 在 JavaScript 中获取一个 Ruby 变量
- 在 Javascript 中访问 Ruby 变量
- 将Ruby变量传递给javascript进行post
- Javascript”;if语句“;和嵌入式ruby(ruby变量始终为true)
- 在Script标记中使用Ruby变量
- 将ruby变量传递给javascript(RubyonRails)
- 如何从Javascript事件更新ruby变量
- 将存储在Ruby变量中的HTML块存储在JavaScriptvar中
- 更改javascript中的ruby变量
- 如何在Javascript中使用ruby变量填充selectize
- Rails 3和jQuery-如何将ruby变量传输到javascript
- 将javascript变量转换为ruby变量
- 如何使用AJAX请求将javascript变量分配给ruby变量
- Ajax js语法与ruby变量