1

Je développe une application Rails 3 dans une capacité largement sans tabless. J'utilise savon_model et ActiveModel pour générer un comportement similaire aux équivalents ActiveRecord. Ci-dessous est mon code:La classe basée ActiveModel ne crée pas les mêmes résultats qu'un ActiveRecord équivilent

class TestClass 
    include Savon::Model 
    include ActiveModel::Validations 

    # Configuration 
    endpoint "http://localhost:8080/app/TestService" 
    namespace "http://wsns.test.com/" 

    actions :getObjectById, :getAllObjects 

    attr_accessor :id, :name 

    def initialize(hash) 
    @id = hash[:id] 
    @name = hash[:name] 
    end 

    client do 
    http.headers["Pragma"] = "no-cache" 
    end 

    def self.all 
    h = getAllObjects(nil).to_array 
    return convert_array_hash_to_obj(h, :get_all_objects_response) 
    end 

    def self.find(id) 
    h = getObjectById(:arg0 => id).to_hash 
    return convert_hash_to_obj(h, :get_object_by_id_response) 
    end 

private 

    def self.convert_array_hash_to_obj(arrayhash, returnlabel) 
    results = Array.new 

    arrayhash.each do |hash| 
     results << convert_hash_to_obj(hash, returnlabel) 
    end 

    return results 

    end 

    def self.convert_hash_to_obj(hash, returnlabel) 
    return TestClass.new(hash[returnlabel][:return]) 
    end 

end 

OK, donc tout fonctionne comme prévu; les valeurs sont extraites du service Web et sur la page. Malheureusement, lorsque je regarde le code HTML produit du côté client, il y a des problèmes. Les liens sont Afficher le long des lignes suivantes:

/testclasses/%23%3CTestClass:0xa814cb4%3E 

au lieu de ...

/testclasses/1 

Alors, je l'ai fait une copie de l'objet (hachage?) À la console pour comparer les sorties.

[#<System:0xa814cb4 @id="1", @name="CIS">] 

au lieu de ce que je crois qu'il devrait être ...

[#<System id="1", name="CIS">] 

J'ai trois questions:
1: Quel est le suffixe hexagonal sur mon nom de classe quand il est imprimé
2: Comment puis-je modifier ma classe pour correspondre à la sortie souhaitée lors de l'impression sur la console? 3: Pourquoi les liens de l'interface (Show, Edit, Delete) sont-ils brisés et y a-t-il une solution facile?

Merci beaucoup pour votre temps et excuses pour le code des ordures/questions stupides. Ceci est ma première application Ruby ou Rails!

Gareth

+0

Eh bien, j'ai un peu plus d'informations. Je comprends que le suffixe hexadécimal est l'object_id, mais je suis toujours perplexe quant à la raison pour laquelle les liens ne fonctionnent pas. Est-ce quelque chose à voir avec route_keys ou link_tos ?! Je devine ici, donc toute lumière que vous pouvez jeter serait grandement appréciée! Merci Gareth –

Répondre

0
  1. Le suffixe hexagonal est l'ID d'objet de votre instance de System
  2. Vous pouvez manipuler la sortie sur la console en mettant en œuvre une méthode d'instance inspect
  3. Les Rails aides d'URL utilisent to_param méthode d'instance pour construire ces liens. Vous devez implémenter ceci si vous allez utiliser votre classe en tant que substitut ActiveRecord.

D'une manière générale, si vous voulez utiliser tous les goodies Rails avec une propre implémentation d'une classe de modèle, vous devez utiliser ActiveModel:Lint::Test pour vérifier quelles parties des API ActiveModel fonctionnent comme prévu.

Plus d'informations peuvent être trouvées ici: http://api.rubyonrails.org/classes/ActiveModel/Lint/Tests.html