Отправка объекта AMF в Rails из Flex повреждает связанную модель - PullRequest
0 голосов
/ 12 марта 2009

Мы работаем над проектом, который использует 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 все работает нормально до тех пор, пока register_user не будет вызван с передаваемым объектом User. Пользователь создается и сеанс обновляется, что приводит к ошибкам в том, что любой вызов метода после этого имеет сторону эффект, что User.find(XX).roles[XX].skip_time_zone_conversion_for_attributes теперь равен nil, что приводит к сбою 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 обходит это и принудительно изменяет его на быть ноль.

Мы перешли к прохождению классов, не являющихся моделями, но это не то, что нам нужно.

Можно ли узнать, какой код в WebORB изменяется skip_time_zone_conversion_for_attributes для всех экземпляров модели, но не для самого класса модели?

1 Ответ

0 голосов
/ 19 марта 2009

У нас была та же проблема, единственное решение, которое мы нашли, - не передавать объекты Flex в Rails, которые имеют ассоциации.

...