【发布时间】:2015-08-16 13:02:41
【问题描述】:
我想将侧边菜单的状态保存在 rails session 变量中,这样如果我的用户折叠侧边菜单,当视图更改时,折叠状态将持续存在。我设置了我的 js,以便未折叠状态将“0”发送到控制器,如果侧边菜单处于折叠状态,则 ajax 将“1”发送到控制器操作。如果控制器操作收到“1”,我希望在我的应用程序中设置该会话变量。
我目前对相应的控制器操作有一个 ajax 请求,折叠的侧导航正在成功发送一个“1”,但会话变量似乎没有持续存在。这是我在侧导航折叠时在控制台中看到的内容:
控制台: (当侧导航折叠时)
Started POST "/dashboard/side_nav_state" for 10.0.2.2 at 2015-06-02 15:58:08 +0000
Processing by DashboardController#side_nav_state as */*
Parameters: {"hide_side_nav"=>"1"}
Completed 200 OK in 2ms (Views: 0.2ms | ActiveRecord: 0.0ms)
(侧边导航展开时)
Started POST "/dashboard/side_nav_state" for 10.0.2.2 at 2015-06-02 16:02:56 +0000
Processing by DashboardController#side_nav_state as */*
Parameters: {"hide_side_nav"=>"0"}
Completed 200 OK in 2ms (Views: 0.2ms | ActiveRecord: 0.0ms)
JavaScript:
sendSideNav(); 函数实际上将 1 或 0 发送到控制器。如您所见,collapsedSideNav(); 函数发送 1。如果您查看 sendSideNav(); 函数,您可以看到 1 被传递到 ajax 请求中的数据键值对。
// collapsible side-nav functionality
function collapsedSideNav(){
$('.side-nav').toggle(300);
$('#collapse-side-nav').css('display', 'none');
$('#expand-side-nav').css('display', 'inherit');
$('.container').animate({
'padding-left' : 0
}, "slow");
$('.row').css({
'max-width' : '98%',
'margin-left' : '1.15rem'
});
sendSideNavStatus(1);
};
// expandable side-nav functionality
function expandedSideNav(){
$('.side-nav').toggle(325);
$('#expand-side-nav').css('display', 'none');
$('#collapse-side-nav').css('display', 'inherit');
$('.container').animate({
'padding-left' : 200
}, "slow");
$('.row').animate({
'max-width' : '95%',
'margin-left' : 'auto'
});
sendSideNavStatus(0);
};
// sends the state of the side-menu (if not default) to the controller so it can be stored in a session
// 1 for true, and 0 for false.
function sendSideNavStatus(trueOrFalse){
$.ajax({
url: '/dashboard/side_nav_state',
method: 'POST',
data: {hide_side_nav: trueOrFalse}
});
};
// DOM Events for collapsing and expanding side-nav
$('#collapse-side-nav').click(function() {
collapsedSideNav();
});
$('#expand-side-nav').click(function() {
expandedSideNav();
});
路线
post 'dashboard/side_nav_state'
控制器操作
def side_nav_state
session[:hide_side_nav] = params[:hide_side_nav] == "1"
render json: {success: true}
end
编辑:
我应该注意到,所有这些都发生在我的仪表板控制器中。无论我在哪个控制器中,我都希望此会话持续存在。这可能吗?我知道您无法路由到您的应用程序控制器,这就是我将逻辑设置到仪表板控制器的原因。我不确定这里的解决方案是什么。
【问题讨论】:
-
这一行在做什么:session[:hide_side_nav] = params[:hide_side_nav] == "1"
-
对我来说它看起来不对,就像永远不会设置会话变量,除非我准备错了
-
如果 ajax 发送“1”,我试图用该行设置会话变量。我很肯定这也是我的错误所在,老实说,我不确定如何正确设置它,而且我之前没有使用过 Rails 会话。如果是你,@RichardAE,你会如何设置该方法?
-
@RichardAE 你读错了;)它将会话变量设置为等式表达式的结果。但如果 OP 想要 0 或 1,那就是错误的表达方式,也许这就是你的意思。
-
@RichardAE 我也试过 sesssion[:hide_side_nav] ||= "1"。
标签: ruby-on-rails ajax