【问题标题】:How can I set a session variable from a js inside haml in ruby on rails?如何在 ruby​​ on rails 中的 haml 内的 js 中设置会话变量?
【发布时间】:2016-12-30 23:12:55
【问题描述】:

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

但我总是得到“其他”条件,即 session[:group_shading] 既没有被设置也没有被识别

css是

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

【问题讨论】:

    标签: javascript ruby session haml


    【解决方案1】:

    您不能在 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 会话(推荐)。

    【讨论】:

    • @MichaelDurrant - 这是一个很长的故事。您需要在控制器中创建一个新操作来处理请求,然后发送请求。你可以在api.jquery.com/jquery.ajax底部找到jquery AJAX的例子
    • 谢谢。我正在尝试上述方法,但页面刷新当前仍会删除阴影。
    • 你能为这些变化创造一个小提琴吗?
    • sessionStore函数从何而来?
    • @BroiSatse 那么你的意思是sessionStorage。这很令人困惑,因为有一个名为 SessionStore 的 Rails 类!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      相关资源
      最近更新 更多