1

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

谢谢你,亚历山德拉

4

3 回答 3

3

您可以使用gon gem。它允许随每个请求自动发送数据,并可以从 javascript 访问它。

例如,在您的 Gemfile 中包含 gem 之后,您可以在 ApplicationController 中添加一个前置过滤器:

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 变量中获得。

于 2012-06-28T08:38:15.960 回答
2

不,会话变量驻留在服务器上,因此没有直接的方法可以使用 javascript/jquery 访问会话变量。

您最好的选择是使用 javascript/jQuery 对服务器进行 ajax 调用,以使用您定义的 url,以返回您想要的会话变​​量,例如 JSON 格式,以便您可以直接在 Javascript 中访问它:

{
  "sessionVariableName": "sessionVariableValue"
}

不,这绝对不是最佳实践。会话变量应保留在服务器 IMO 上。

于 2012-06-28T08:00:39.893 回答
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);
         }
       });
    },
    

只要他没有退出应用程序,这个过程就会保存用户的选择。有点复杂,但按我想要的方式工作。

于 2013-01-08T15:58:21.220 回答