我们正在开发一个将 Flex 和 rails 与WebORB结合使用的项目。在我们开始将前端和后端捆绑在一起之前,一切都很好。
我们创建了一个用于与用户交互的服务,另一个用于会话。
SessionService.rb
class SessionService
def view_session
session = RequestContext.get_session
if session[:user_id]
user = User.find_by_id(session[:user_id], :include => [:contact, {:roles => :permissions}])
else
user = User.find_by_username("anonymous", :include => [:contact, {:roles => :permissions}])
end
user
end
end
UserService.rb
class UserService
def register_user user
user.save
session = RequestContext.get_session
session[:user_id] = user.id
RequestContext.set_session session
return true
end
end
User.as
package com.XXX.XXXXX.vo
{
[Bindable]
[RemoteClass(alias="com.XXX.XXXXX.vo.User")]
public class User
{
...
public var roles:Array;
...
}
}
当使用 Flex 调用任何方法时,一切正常,直到调用传入的 User 对象。创建了用户并更新了会话,问题是在此之后的任何方法调用都会产生现在为零register_user
的副作用,User.find(XX).roles[XX].skip_time_zone_conversion_for_attributes
这会导致create_time_zone_conversion_attribute?
在activerecord/lib/activerecord/attribute_methods.rb
尝试调用include?
它时失败。
并且由于create_time_zone_conversion_attribute?
在调用时method_missing
调用,直接访问任何属性都会导致此错误。这不会是一个问题,除非:include => [..., :roles...]
它会导致角色被序列化到AMF中,并且当它尝试序列化属性时,它会爆炸。
从我收集到的信息attribute_methods.rb
来看,应该不可能skip_time_zone_conversion_for_attributes
在一个实例中进行更改(Role.skip_time_zone_conversion_for_attributes = []
应该是这样),但我感觉 WebORB 正在绕过这个并强行将其更改为 nil。
我们已经切换到传递非模型类,但这不是我们想要的。
是否有可能找出 WebORB 中的哪些代码正在skip_time_zone_conversion_for_attributes
针对模型的所有实例进行更改,而不是针对模型类本身?