2009-03-11 9 views
-1

Nous travaillons sur un projet utilisant Flex et rails avec WebORB. Tout allait bien et dandy jusqu'à ce que nous commencions à lier le frontend et les backends ensemble.Envoyer un objet AMF à Rails à partir de Flex corrompt le modèle associé

Nous avons créé un service pour interagir avec les utilisateurs et un autre pour la session.

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; 
     ... 
    } 
} 

Lorsque vous appelez une méthode avec Flex, tout fonctionne bien jusqu'à ce que register_user est appelée avec un objet utilisateur étant transmise. L'utilisateur est créé et la session est mise à jour, ce qui ne va pas, c'est que toute méthode appelle après cela avoir un effet secondaire que User.find(XX).roles[XX].skip_time_zone_conversion_for_attributes est maintenant nul, ce qui provoque create_time_zone_conversion_attribute? en activerecord/lib/activerecord/attribute_methods.rb échouer en essayant d'appeler include? dessus.

Et puisque create_time_zone_conversion_attribute? est appelée lorsque method_missing est appelée, l'accès direct à n'importe quel attribut provoque cette erreur. Cela ne poserait pas de problème, à l'exception du :include => [..., :roles...] qui provoque la sérialisation des rôles en AMF et lorsqu'il tente de sérialiser les attributs, il est bombardé.

D'après ce que je crois en attribute_methods.rb, il ne devrait pas être possible de changer skip_time_zone_conversion_for_attributes dans une instance (Role.skip_time_zone_conversion_for_attributes = [], comme cela devrait être) mais j'ai le sentiment que WebORB contourne cela et changer forceibly à être nul.

Nous sommes passés à des classes non modèles passantes, mais ce n'est pas ce que nous voulons.

Est-il possible de trouver quel code dans WebORB change skip_time_zone_conversion_for_attributes pour toutes les instances d'un modèle mais pas la classe de modèle elle-même?

Répondre

0

Nous avons eu le même problème, la seule solution que nous avons trouvée était de ne pas passer les objets Flex aux Rails qui ont des associations.

Questions connexes