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 オブジェクトで が呼び出されるまで、すべて正常に動作します。ユーザーが作成され、セッションが更新されます。問題は、この後のメソッド呼び出しが nil に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
変更することはできないはずです(そうあるべきです)が、WebORBはこれをバイパスして強制的にnilに変更していると感じています。skip_time_zone_conversion_for_attributes
Role.skip_time_zone_conversion_for_attributes = []
非モデル クラスを渡すように切り替えましたが、これは私たちが望んでいるものではありません。
skip_time_zone_conversion_for_attributes
モデル クラス自体ではなく、モデルのすべてのインスタンスに対してWebORB のどのコードが変更されているかを調べることは可能でしょうか?