WebOrb tem se demonstrado muito bom no seu trabalho, estou gostando de desenvolver com ele, após descobrir que qualquer classe do ruby, não apenas as classes Service podem ser usadas como objetos remotos, fiquei muito feliz e logo tive boas experiências.
Boas experiências é poder chamar um ActiveRecord puramente apartir do flex:
remoteObject = new RemoteObject();
remoteObject.destination = "Person";
remoteObject.all({"include": "address",
"conditions": ["age > ?",18]});
Para isso apenas foi necessário alguns passos:
Adicionar a configuração do serviço remoto:
Para trabalhar com weborb, existe um arquivo no projeto em que são mapeados os serviços, por padrão está em:
Rails.root/config/WEB-INF/flex/remoting-config.xml
Neste arquivo deve ser adicionado o mapeamento entre as classes:
<destination id="Person">
<properties>
<source>Person</source>
</properties>
</destination>
Adicionar mapeamento dos modelos
Após isso, é necessário configurar a classe ActionScript que irá receber o modelo, para ser possível recuperar as informações. O arquivo agora é:
Rails.root/config/weborb-config.xml
<classMapping> <clientClass>com.model.Person</clientClass> <serverClass>Person</serverClass> <source>Person</source> </classMapping> <classMapping> <clientClass>com.model.Address</clientClass> <serverClass>Address</serverClass> <source>Person</source> </classMapping>
Verificar os modelos do Rails
No model, sabe-se que é usado classes ActiveRecord como:
class Person < ActiveRecord::Base belongs_to :address end class Address < ActiveRecord::Base end
Verificar os modelos do ActionScript
A classe model do ActionScript deve possuir os atributos que serão instanciados no Flex:
package com.model {
[RemoteClass(alias="com.model.Person")]
public class Person {
public var name:String;
public var age:Number;
public var address:Address;
public function Person() {
}
}
}
Compatibilizar os hashs do Rails e ActionScript
Após isso, existe um pequeno problema entre as classes que são usadas como serviços, que o Hash do flex, converte as chaves como string, por não possuir símbolos, então é necessário fazer um pequeno hack no método find por exemplo:
module SymbolizeArgs
module ClassMethods
# this hack should be used by remoteObjects
# that just pass a Hash with string keys
# because this we need to symbolize the keys
def find_with_simbolyzed_keys( *args )
options = {}
old_options = args.extract_options!
old_options.each{|key,value|
if key.kind_of?(String)
options[key.to_sym] = value
else
options[key] = value
end
}
args.push options
find_without_simbolyzed_keys *args
end
end
def self.included(base)
base.class_eval do
extend ClassMethods
class << self
alias_method_chain :find, :simbolyzed_keys
end
end
end
end
module ActiveRecord
class Base
include SymbolizeArgs
end
end
O código acima pode ficar na pasta/arquivo: Rails.root/config/initializers/active_record_simbolyze_keys.rb
Com esta alteração é possível usufruir do método find com todos os seus benefícios, de uma maneira fácil, a classe ActiveRecord fica totalmente exposta ao ActionScript.
Se o código acima não for ativado, você receberá um erro como: “Unknown key(s): conditions (ArgumentError)”
ps: Inspirado em: http://onrails.org/articles/2006/10/29/part-1-using-weborb-to-access-activerecords-from-a-flex-application