2012-03-12 38 views
0

我正在使用Rails 3.我编写的控制器非常冗长。所以我想重构控制器。如何修改模型中的会话?

予编码的称为ProductMaker这使产品和修改会话(向导形式CURRENT_STEP产品的任务,如果请求是一个刷新等)

此类具有方法,该方法接收会话参数类,修改然后返回这个新的会话。

控制器的动作:在lib文件夹

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 

我ProductMaker类:​​

class ProductMaker 

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

end 

然而,当我写的关键问题LINE会议是一个零值。如果我评论这一行,会话是一个ActionDispatch :: Session :: AbstractStore :: SessionHash。

这可能是问题所在? 我如何重构控制器逻辑,修改许多会话密钥,并根据会话值“填充”模型,以建模/分类?

更新:

我在阅读有关红宝石中的绑定。

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

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

在此先感谢

回答

-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 

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

1

您指定的“关键问题行” session =。这会为create方法创建一个局部变量,该方法会在ActionController::Base上遮蔽session方法。在分配它之前,局部变量是nil(不是不存在的!),所以最终结果是整个方法的session == nil,这明显地破坏了一切。所以:不要分配session。调用你的返回值别的东西。

+0

非常感谢你,如果我昨天了解这个问题,我的新问题是修改会话变量,最后我使用绑定。 – maxiperez 2012-03-13 14:46:19

0

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

类OwnController < ApplicationController中 DEF my_action SettingManager.modify( “会话[:会话]”,结合) 端 端

类SettingManager DEF self.modify(会话,装订) eval“#{session} .any_value = 5”binding eval“#{session}。其他值='值'“,绑定 结束 结束