如何在模型中修改会话?

时间:2012-03-12 18:58:29

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

我正在使用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

我在AutoCAD文件夹中的ProductMaker类:​​

class ProductMaker

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

end

然而,当我写KEY KEYBLEM LINE时,会话是一个零值。如果我评论这一行,会话是一个ActionDispatch :: Session :: AbstractStore :: SessionHash。

哪个可能是问题? 我怎样才能重构控制器逻辑,修改许多会话密钥并根据会话值“填充”模型到模型/类?

更新:

我正在读关于红宝石的绑定。

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

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

提前致谢

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

实施例

类OwnController< ApplicationController的    def my_action      SettingManager.modify(“session [:session]”,绑定)    结束 端

类SettingManager   def self.modify(session,binding)     eval“#{session} .any_value = 5”绑定     eval“#{session} .other_value ='value'”,绑定   结束 端

答案 2 :(得分:-1)

最后我使用绑定。

例如:

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

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