如何在rails上的ruby中的has里面设置一个会话变量?

时间:2014-05-24 14:17:21

标签: javascript ruby session haml

我通过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 

但我总是得到其他&#39;条件,即session[:group_shading]未被设置或识别

css是

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

2 个答案:

答案 0 :(得分:2)

您无法在javascript中使用erb语句,在将其发送到客户端之前会对其进行解析。而是使用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会话(推荐)。

答案 1 :(得分:0)

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

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