我正在从3.0.10升级到Rails 3.1.0,我正在使用Devise进行身份验证。
我有许多功能测试需要我设置一个会话变量。沿着这条线:
test "new clears current_lesson_id from session" do
get :new, nil, {'current_lesson_id' => '234234'}
assert_response :success
assert_nil session[:current_lesson_id]
end
这是失败的,因为我的会话信息破坏了设计认证会话数据,因此我之前的解决方案是与默认会话合并:
test "new clears current_lesson_id from session" do
get :new, nil, authenticated_sesion_with({'current_lesson_id' => '234234'})
assert_response :success
assert_nil session[:current_lesson_id]
end
def authenticated_session_with(hash)
session.merge(hash)
end
所有这一切都适用于rails 3.0.10(warden 1.0.4和devise 1.4.2),但不再使用rails 3.1.0(和warden 1.0.5,设计1.4.4)。现在我收到以下错误:
NoMethodError: private method `stringify_keys' called for <ActionController::TestSession:0x000001060db590>
我收集这是因为'session'对象是ActionController :: TestSession的一个实例,而在rails 3.1.0中有一堆实例变量不能也不应该被“字符串化”。
我应该如何正确访问设计用户信息(最好是动态的),以便我可以添加'current_lesson_id'等?
非常感谢,
答案 0 :(得分:0)
尝试这个来修复Rails 3.1中的错误
sign_in user
hashy = session['warden.user.user.key'][2]
get :action, nil, {"warden.user.user.key"=>["User", [user.id],hashy]}, nil
为我工作。似乎不喜欢Rails处理TestSessions的新方式。
答案 1 :(得分:0)
我认为你最好这样做:
def valid_session
my_session_values = {:some_key => :some_value}
session.to_hash.merge my_session_values
end