从骨干视图访问Rails会话变量

时间:2012-06-27 21:51:04

标签: javascript ruby-on-rails-3 jquery backbone.js

这可能是一个非常简单的问题,但我找不到答案。我应该如何从javascript / jQuery(从Backbone视图)访问rails会话变量?这很可能不是最好的做法,但对我来说这不是问题。

谢谢你, 珊

3 个答案:

答案 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会话变量的主要原因是能够修改它们。由于我不确定我想要什么,我的问题开始时是模棱两可的(例如,访问会话变量不一定是直接过程)。我最终实现目标的方式是使用以下四个步骤:

  1. 确保在sessions_controller.rb文件中初始化所需的rails会话变量

  2. 将您希望能够修改的会话变量的值发送到主干(在我的情况下,会话变量由使用过的rails控制器访问,然后发送到相应的rails视图,然后到主干app.js文件,使它们可以访问必要的主干视图)

  3. 在rails侧(在使用的控制器中)创建一个函数,该函数可以根据来自主干的GET请求更新rails会话变量。例如:

    def modify_session_variables
      if params[:taskParentId]
        session[:task_parent_id] = params[:taskParentId]
      end
    end
    
  4. 每次用户更改表示会话状态的主干变量时,向服务器发送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);
         }
       });
    },
    
  5. 只要他没有退出应用程序,此过程将保存用户选择。有点复杂,但按照我想要的方式工作。