2009-05-07 3 views
0

Ich habe eine kurze Frage über aktive Ressource. Wenn ich einen Benutzer Ressource haben, wenn ich einen Anruf machen wieSchienen activesource Nachrichten

User.find(1).put(:promote, :position => 'manager') 

Nach dem api übersetzt sie in diesem Aufruf /users/1/promote.xml?position=manager

Meine Frage ist. Werden hier von activeResour tatsächlich zwei Anrufe getätigt? Finden Sie ein get, dann setzen Sie auf dieses Objekt, oder fügt .put an die .find bedeuten, dass es nur einen einzigen Anruf macht. Wenn das so ist, dann ist der einzige Grund für die .find das richtige URL-Format von/users /: id/promote ??

Ich konnte nicht in den Dokumenten finden, wo dies angegeben werden könnte, aber es ist die .find, die mich denken lassen, dass vielleicht zwei Serviceanrufe stattfinden?

Antwort

0

Wenn ActiveResource wie ActiveRecord funktioniert, würde ich "ja" sagen. Wenn Sie so etwas wie

Foo.find(1).update_attributes(:name=>"Bar") 

Active tun hat zuerst ein Wählen Sie das Objekt bekommen und dann einen update Aufruf an die Datenbank den Datensatz zu ändern. Ich würde vermuten, dass ActiveResources in ähnlicher Weise funktioniert, wo es zwei Web-Service-Aufrufe ausgibt, um das Objekt abzurufen und dann das Objekt zu aktualisieren.

+0

Ich hoffe, dass dies nicht der Fall ist, das würde aus Sicht der Service-Leistung unglaublich arm scheinen. Da es alle xml-Nachrichten sind, tut die anfängliche Suche nichts für mich, außer dass der Aufruf von User.put (: promote ...) kein Benutzerobjekt, sondern einen Hash von Benutzerattributen zurückgibt ... also empfiehlt die API using User.find (x) .put ... Ich bin immer noch interessiert, weiß aber, ob jemand eine definitive Antwort hat – brad

+0

Sie könnten einen Paket-Sniffer ausführen, z WireShark, um das definitiv zu testen. – Schrockwell

+0

Die Sache ist, Rails muss überprüfen, ob User.find (1) tatsächlich existiert und gibt nil nicht zurück, andernfalls versucht es, einen put-Vorgang für einen nicht existenten Datensatz auszuführen. Dies führt mich zu der Annahme, dass es zwei Anrufe, aber ich stimme @Schrockwell, Packet Sniffer FTW – Scott

0

gäbe folgend in Ihrem Initialisierer:

class ActiveResource::Connection 
    # Creates new Net::HTTP instance for communication with 
    # remote service and resources. 
    def http 
    http = Net::HTTP.new(@site.host, @site.port) 
    http.use_ssl = @site.is_a?(URI::HTTPS) 
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE if http.use_ssl 
    http.read_timeout = @timeout if @timeout 
    #Here's the addition that allows you to see the output 
    http.set_debug_output $stderr 
    return http 
    end 
end 

Search ' "http.set_debug_output $ stderr" "Active"' den ursprünglichen Autor dieses hilfreichen Tipps zu finden.

+0

Dies scheint nicht in Rails 3 arbeiten. – huug

Verwandte Themen