我正在使用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方法修改会话?
如果您有其他想法,请发表您的回答。
提前致谢
答案 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
在我有一个非常详细的控制器之前,我必须修改和管理许多会话值。 现在我可以重构这个逻辑来建模。