【问题标题】:Accessing Rails Session Variable from Backbone View从主干视图访问 Rails 会话变量
【发布时间】:2012-06-27 21:51:03
【问题描述】:

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

谢谢你, 亚历山德拉

【问题讨论】:

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


    【解决方案1】:

    您可以使用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 变量中获得。

    【讨论】:

      【解决方案2】:

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

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

      {
        "sessionVariableName": "sessionVariableValue"
      }
      

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

      【讨论】:

        【解决方案3】:

        以防万一这可能对某人有所帮助......

        虽然 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);
               }
             });
          },
          

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          • 2011-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-25
          • 1970-01-01
          相关资源
          最近更新 更多