如何在Rails中的ruby中的haml中的js中设置会话变量? [英] How can I set a session variable from a js inside haml in ruby on rails?

查看:91
本文介绍了如何在Rails中的ruby中的haml中的js中设置会话变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我通过js有表格行底纹(针对行组).
我想这样做,以便通过会话变量记住阴影.

I have table row shading (for groups of row) via js.
I want to make it so that the shading is remembered through a session variable.

我正在使用的haml部分具有:

The haml partial I am using has:

Group Shading: 
  %a{:href => '#', :id => 'row_colors_on'}
    On
  %a{:href => '#', :id => 'row_colors_off'}
    Off

js具有:

$(function(){
$("a#row_colors_on").click(function(){
$(".row_color_group_1").addClass("color_group_1");
$(".row_color_group_2").addClass("color_group_2");
$(".row_color_group_3").addClass("color_group_3");
<%- session.group_shading = 'true' %>
event.preventDefault();
});
});
$(function(){
$("a#row_colors_off").click(function(){
$(".row_color_group_1").removeClass("color_group_1");
$(".row_color_group_2").removeClass("color_group_2");
$(".row_color_group_3").removeClass("color_group_3");
<%- session.group_shading = 'false' %>
});
});

然后,主页使用:

- row_bg_color_group = 'row_color_group_1'
- for link in @links
  - construct_hyperlink(link.url_address, link.alt_text)
  - if link.group.group_name != (current_group ||= '') 
    - display_group = current_group = link.group.group_name
    - row_bg_color_group = rotate_rows_color_group
  - else
    - display_group = ''
   %tr{:class => "#{row_bg_color_group}"}

更改行背景颜色的代码可以做到这一点,但是在通过会话变量刷新页面后,它是否还没有被记住?

The code to change the background color of rows does do it but it is not remembered after a page refresh through the session variable ?

与助手一起:

def rotate_rows_color_group
  if session[:group_shading] == 'true'
    cycle('row_color_group_1', 'row_color_group_2', 'row_color_group_3')
  else
   'row_color_group_1'
  end 
end 

但我总是遇到'else'条件,即未设置或识别 session [:group_shading]

but I always get the 'else' condition, i.e. session[:group_shading] is not being either set or recognized

css是

.color_group_1 { background-color: #133333; }
.color_group_2 { background-color: #122222; }
.color_group_3 { background-color: #111111; }

推荐答案

您不能在javascript中使用erb语句,它会在发送到客户端之前被解析.而是使用javascript sessionStorage :

You can't use erb statements within javascript, it is parsed before it is send to a client. Instead use javascript sessionStorage:

$(function(){
$("a#row_colors_on").click(function(){
$(".row_color_group_1").addClass("color_group_1");
$(".row_color_group_2").addClass("color_group_2");
$(".row_color_group_3").addClass("color_group_3");
sessionStore.setItem('group_shading', true);
event.preventDefault();
});
});
$(function(){
$("a#row_colors_off").click(function(){
$(".row_color_group_1").removeClass("color_group_1");
$(".row_color_group_2").removeClass("color_group_2");
$(".row_color_group_3").removeClass("color_group_3");
sessionStorage.setItem('group_shading', false);
});
});

$(document).ready(function() {
  if (sessionStorage.getItem('group_shading'))
    $("a#row_colors_on").click();
});

重要提示:

但是请注意,js会话不是您的rails会话.Rails会话可以存储在各个地方,而javascript无法访问它.这意味着您无法在服务器端访问这些值.有两种解决方案:

Important note:

Note however that js session is sth else than your rails session. Rails session can be stored in various places and javascript has no access to it. This means you can't access those values on the server side. There are two solutions:

1)使用sessionStorage并在页面加载后根据存储的值执行一些javascript(如上所述).

1) Use sessionStorage and execute some javascript depending on stored value after the page has loaded (as above).

2)代替使用sessionStorage,向服务器发送ajax请求以填充Rails会话(推荐).

2) Instead of using sessionStorage, send an ajax request to server to populate rails session (recommended).

这篇关于如何在Rails中的ruby中的haml中的js中设置会话变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆