2012-03-12 63 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}。其他值='值'「,綁定 結束 結束