这可能是一个非常简单的问题,但我找不到答案。我应该如何从javascript / jQuery(从Backbone视图)访问rails会话变量?这很可能不是最好的做法,但对我来说这不是问题。
谢谢你, 珊
答案 0 :(得分:3)
您可以使用gon gem。它允许自动发送每个请求的数据,并允许从javascript访问。
例如,在Gemfile中包含gem之后,可以在ApplicationController中添加一个before过滤器:
class ApplicationController < ActionController::Base
before_filter :set_gon
...
protected
def set_gon
gon.my_session_variable = session[:my_session_variable]
end
end
在你的应用程序布局中,html的部分头部:
<%= include_gon %>
现在您可以从javascript中读取此值:
alert(gon.my_session_variable)
这样,您只需在ajax响应中包含特定于请求的数据,并且可以从gon变量中获取所有额外信息。
答案 1 :(得分:2)
不,会话变量驻留在服务器上,因此没有使用javascript / jquery访问会话变量的直接方法。
您最好的选择是使用javascript / jQuery向服务器发出ajax调用,并将其定义为返回您想要的会话变量,例如JSON格式,以便您可以直接在Javascript中访问它:
{
"sessionVariableName": "sessionVariableValue"
}
不,这绝对不是最佳做法。会话变量应保留在服务器IMO上。
答案 2 :(得分:0)
以防这可能对某人有帮助......
虽然ejosafat的答案是有效的,但我需要从Backbone访问rails会话变量的主要原因是能够修改它们。由于我不确定我想要什么,我的问题开始时是模棱两可的(例如,访问会话变量不一定是直接过程)。我最终实现目标的方式是使用以下四个步骤:
确保在sessions_controller.rb文件中初始化所需的rails会话变量
将您希望能够修改的会话变量的值发送到主干(在我的情况下,会话变量由使用过的rails控制器访问,然后发送到相应的rails视图,然后到主干app.js文件,使它们可以访问必要的主干视图)
在rails侧(在使用的控制器中)创建一个函数,该函数可以根据来自主干的GET请求更新rails会话变量。例如:
def modify_session_variables
if params[:taskParentId]
session[:task_parent_id] = params[:taskParentId]
end
end
每次用户更改表示会话状态的主干变量时,向服务器发送ajax请求,其中包含rails会话变量的更新值。例如,我的一个骨干模型将在修改其中一个属性时更新会话变量:
saveAsParentTask: function() {
var self = this;
$.ajax({
url: '/modify_session_variables',
type: 'GET',
data: {
taskParentId: self.getId()
},
async: false,
success: function() {
App.filtersState.setSubtreeParent(self);
}
});
},
只要他没有退出应用程序,此过程将保存用户选择。有点复杂,但按照我想要的方式工作。