我如何设置一个会话变量从js在haml在ruby on rails

How can I set a session variable from a js inside haml in ruby on rails?

本文关键字:js ruby rails on 变量 haml 一个 何设置 设置 会话      更新时间:2023-09-26

我有表行阴影(组的行)通过js。
我想通过会话变量来记住阴影。

我正在使用的haml部分有:

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

更改行背景颜色的代码确实做到了,但在通过会话变量刷新页面后不记得了吗?

与帮助器:

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]没有被设置或识别

css

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

你不能在javascript中使用动词语句,它在发送给客户端之前被解析。使用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无法访问它。这意味着您不能在服务器端访问这些值。有两种解决方案:

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

2)不使用sessionStorage,而是向服务器发送一个ajax请求来填充rails会话(推荐)。

您可以使用cookie在Javascript(客户端)和Rails(服务器端)之间共享状态。你可以通过Javascript在视图中设置cookie(查看js-cookie库),并在Rails控制器中读取cookie。

使用js-cookie库,您可以设置一个cookie:(Cookie.set('awesome', 'sauce')),然后在Rails控制器(puts cookies['awesome'])中读取它。