【问题标题】:how modify session in model?如何修改模型中的会话?
【发布时间】:2012-04-23 22:12:33
【问题描述】:

我正在使用 Rails 3。我正在编写一个非常冗长的控制器。所以我正在尝试重构控制器。

我编写了一个名为 ProductMaker 的类,它制作产品并修改会话(向导表单的产品任务为 current_step,如果请求是刷新等)

这个类有方法接收会话作为参数,修改然后返回这个新会话。

控制器动作:

  def new
    #INITIALIZE CODE
    session[:refresh] ||= SortedArray.new [1]
    #...MORE CODE
  end

    def create
     #...MUCH CODE
     unless Utilities.is_refresh(session[:refresh])
        #...more code
        session = ProductMaker.some_method_which_return_session(session) #KEY PROBLEM LINE
        #...more code
     end
     #... MORE CODE
    end

我在 lib 文件夹中的 ProductMaker 类:

class ProductMaker

def self.some_method_which_return_session(session)
 session[:any_key] = "some value"
 return session
end

end

但是,当我编写 KEY PROBLEM LINE 时,会话是一个 nil 值。如果我评论这一行,则会话是 ActionDispatch::Session::AbstractStore::SessionHash。

可能是什么问题? 我如何重构控制器逻辑,修改许多会话键并根据会话值“填充”模型到模型/类?

更新:

我正在阅读有关 ruby​​ 中的绑定。

如何使用绑定和 eval 方法修改会话?

如果您有其他想法,请发表您的答案。

提前致谢

【问题讨论】:

    标签: ruby-on-rails-3 session-variables session-cookies


    【解决方案1】:

    您在“关键问题行”上分配session =。这会为create 方法创建一个局部变量,它会在ActionController::Base 上隐藏session 方法。局部变量在分配之前是nil(不是不存在!)所以最终结果是整个方法的session == nil,这显然会破坏一切。所以:不要分配session。将您的返回值称为其他值。

    【讨论】:

    • 非常感谢。如果我昨天理解了这个问题。我的新问题是修改会话变量。最后我使用绑定。
    【解决方案2】:

    我使用绑定技术。所以我传递上下文(模拟参数传递引用变量)。

    例子

    类OwnController

    类 SettingManager def self.modify(会话,绑定) eval "#{session}.any_value = 5" 绑定 eval "#{session}.other_value = 'value'", 绑定 结尾 结束

    【讨论】:

      【解决方案3】:

      最后我使用了绑定。

      例如:

      class SessionManager
      
      self.update(session, binding)
       eval "#{session} = 0", binding
      end
      
      end
      
      class SomeController < ApplicationController
      
      def foo_action_1
        session[:refresh] = 1
      end
      
      def example_ajax_modify_session
         a = session[:refresh] == 1 #true
         SessionManager.update("session[:refresh]", binding)
         b = session[:refresh] == 1 #false
         a == b #false because a == 1 and b == 0
      end
      

      我必须修改和管理许多会话值,所以在我拥有一个非常详细的控制器之前。 现在我可以将这个逻辑重构为模型。

      【讨论】:

        猜你喜欢
        • 2016-11-25
        • 2011-01-11
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2019-08-06
        • 2012-06-26
        • 2019-10-28
        • 2013-01-06
        相关资源
        最近更新 更多